Одно из свойств свойства только для записи - поддержка внедрения зависимости сеттера, которое обычно используется для необязательных параметров.
Допустим, у меня был класс:
public class WhizbangService {
public WhizbangProvider Provider { set; private get; }
}
WhizbangProvider не предназначен для доступа внешнего мира. Я бы никогда не хотел взаимодействовать с service.Provider
, это слишком сложно. Мне нужен класс, как WhizbangService, чтобы действовать как фасад. Но с сеттером я могу сделать что-то вроде этого:
service.Provider = new FireworksShow();
service.Start();
И служба запускает фейерверк. Или, может быть, вы бы предпочли посмотреть водное и световое шоу:
service.Stop();
service.Provider = new FountainDisplay(new StringOfLights(), 20, UnitOfTime.Seconds);
service.Start();
И так далее ...
Это становится особенно полезным, если свойство определено в базовом классе. Если вы выбрали конструкцию для этого свойства, вам нужно написать перегрузку конструктора в любом производном классе.
public abstract class DisplayService {
public WhizbangProvider Provider { set; private get; }
}
public class WhizbangService : DisplayService { }
Здесь альтернатива внедрению в конструктор:
public abstract class DisplayService {
public WhizbangProvider Provider;
protected DisplayService(WhizbangProvider provider) {
Provider = provider ?? new DefaultProvider();
}
}
public class WhizbangService : DisplayService {
public WhizbangService(WhizbangProvider provider)
: base(provider)
{ }
}
Этот подход, на мой взгляд, более сложный, потому что вам нужны некоторые внутренние операции класса, в частности, если вы передадите null
конструктору, вы получите разумное значение по умолчанию.