2016-08-09 3 views
5

У меня есть объект со свойством, для которого я хочу, чтобы создать пользовательский сеттер, а также сохранить автоматический поглотитель:Пользовательские сеттер но авто геттер

public class SomeObject 
{ 
    public int SomeProp { get; set; } 
    public Nullable<short> MyProp 
    { 
     get 
     { 
     return MyProp; 
     } 
     set 
     { 
     if (value != null) 
     { 
      SomeProp = SomeWork(value); 
      MyProp = value; 
     } 
     } 
    } 
} 

Проблема заключается в том, что я получаю ошибку StackOverflow на поглотителе , Как реализовать свойство, в котором я храню геттер как есть, но только изменить сеттер?

+13

Вы не можете. Вам нужно поле. – SLaks

+0

В этом случае вам понадобится второе поле. В противном случае вы получите бесконечный цикл в getter – mmcrae

+3

Я не понимаю, что со всеми downvotes? – Steve

ответ

5

Вам необходимо использовать фоновое поле для вашего имущества. Вы получаете ошибку SO, потому что вы рекурсивно ссылаетесь на свое свойство MyProp в своем собственном геттере, что приводит к бесконечной рекурсии.

private short? _myProp; 

public short? MyProp 
{ 
    get 
    { 
     return _myProp; 
    } 
    set 
    { 
     if (value != null) 
     { 
      SomeProp = SomeWork(value); 
      _myProp = value; 
     } 
    } 
} 
+0

Thanks; просто никогда раньше не было этого случая. – frenchie

+0

Даже когда вы используете автоматически реализованные свойства, все еще есть неявное поле поддержки, которое создается автоматически для вас. –

2

Вы получаете исключение, потому что вы по сути делаете бесконечную рекурсию в своей собственности.

К сожалению, вы еще не можете описать, что вы описываете на C#, вам необходимо определить поле поддержки самостоятельно.

+0

Будет ли это когда-либо реализовано? Интересно ... –

+0

@roryap, я так не думаю, и не вижу логики/выгоды для ее реализации. – Rahul

+0

@roryap Надеюсь, в конце концов, возможно, я немного навязчивый, но мне всегда было больно иметь дополнительное поле. Хотя теперь, когда я думаю об этом, проблема в том, что после того, как вы выполняете собственную реализацию, больше нет никакой гарантии того, откуда это происходит. – EJoshuaS

1

Вы не можете этого сделать. Вы либо используете пользовательские сеттеры getter (оба, не одиночные), либо используете автогрейдеры.

В программном коде добытчика вашей собственности пытается получить доступ к геттер самой себя (который собирается получить доступ к такой же поглотитель и так далее, и так далее)

Таким образом, это бесконечный цикл, который собирается уничтожить все мир и довести до конца человечества

1

НЕТ, это невозможно. Либо вы сделаете его полным auto (OR), определите как getter, так и setter, и в этом случае вам нужно будет предоставить поле поддержки, так как компилятор не создаст его для вас.

Смежные вопросы