Потому что автоматические свойства ломаются 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. Это очень хорошо описывает, почему вы предпочитаете держать приватного сеттера.
Какое предложение? Возможно, вам повезет, попросив его прямо. – Otiel
Безопасность нитей - это то, что первое приходит на ум. Если у вас есть общедоступный статический атрибут _automatic_, вы можете легко создавать условия гонки, потому что сеттер является общим для всех экземпляров класса. –
@JohnWillemse Это предложение просто утверждает сценарий статических автоматических свойств. Я знаю, что нам нужна дополнительная работа, чтобы сделать сеттер безопасным для потоков, это не должно применяться только к статическим автоматическим свойствам. – ValidfroM