2013-05-24 2 views
3

В книге < < C# в глубине >>, я прочитал приговор «Единственный сценарий, в котором я могу видеть статические автоматические свойства бытия полезно, когда геттер является общедоступным, а сеттер является закрытым, а сеттер называется только в инициализаторе типа ». Я не знаю, что здесь предложил Джон Скит.Почему статические автоматические свойства только полезно, в которых добытчик является публичным и сеттер является частным

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

+0

Какое предложение? Возможно, вам повезет, попросив его прямо. – Otiel

+0

Безопасность нитей - это то, что первое приходит на ум. Если у вас есть общедоступный статический атрибут _automatic_, вы можете легко создавать условия гонки, потому что сеттер является общим для всех экземпляров класса. –

+0

@JohnWillemse Это предложение просто утверждает сценарий статических автоматических свойств. Я знаю, что нам нужна дополнительная работа, чтобы сделать сеттер безопасным для потоков, это не должно применяться только к статическим автоматическим свойствам. – ValidfroM

ответ

2

Потому что автоматические свойства ломаются encapsulation, что является основным преимуществом ООП. Вы не можете инкапсулировать данные с помощью автоматических свойств. Задача инкапсуляции заключается в обеспечении того, чтобы ваш объект оставался в согласованном состоянии. Если вы используете авто-свойства, как это:

public IFoo Foo { get; set; } 

у вас нет опции для проверки значения в инкубаторе. Установка свойства на null возможна, не давая вам возможности даже заметить или запретить его. Это может быть то, что вы хотите, но это, вероятно, упрощает неправильное использование вашего интерфейса. Вот почему упомянутые выше blog-post

Это запах кода, а не анти-шаблон.

Вы должны предпочесть этот стиль:

public IFoo Foo { get; private set; } 

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

public Bar(IFoo foo) 
{ 
    if (foo == null) 
     throw new ArgumentNullException("Foo"); 

    this.Foo = foo; 
} 

Это облегчает клиентам возможность использовать ваш объект в правильном направлении. Я действительно предлагаю прочитать ранее упомянутый blog-post. Это очень хорошо описывает, почему вы предпочитаете держать приватного сеттера.

+0

Предложение о статических автоматических свойствах. Ваш образец касается обычных автоматических свойств. Однако я согласен с вашими аргументами. – Peter

+0

Проблемы одинаковы для статических и нестатических классов. В этом случае * static * ограничивает количество экземпляров вашего класса до 1. Однако это обычно делает более важным управлять настройкой данных. – Carsten

2

Дело в том, что статические элементы обычно должны быть потокобезопасными ... и автоматически реализованные свойства не являются потокобезопасными с точки зрения гарантии того, что значение, написанное одним потоком, будет немедленно видно другой. Вы не можете изменить, что в автоматической собственности, так что только раз статическое автоматическое свойство является полезным:

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

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

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