как простой пример; это дешевый способ создания «достаточно неизменного» объекта (для использования в потоках, состоянии и т. д.). Но также и в любом месте, где клиенту просто не нужно назначать его, или нельзя доверять для его назначения (правильно).
Другим примером может быть список:
public List<Foo> Items {get;private set;}
, поскольку мы могли бы назвать obj.Items.Add()
и т. Д., Но мы бы редко присваивали obj.Items = ...
. Однако этот пример искажен необходимостью явной инициализации в конструкторе, а XmlSerializer
ненавидит его - если честно, для списков, которые я в основном использую:
private readonly List<Foo> items = new List<Foo>();
public List<Foo> Items {get { return items;}}
, который решает оба из них.
В качестве другого примера, контрастируем:
private readonly int foo;
public int Foo {get{return foo;}}
против
private readonly int foo;
public int Foo {get{return foo;} private set {foo=value;}}
этот шаблон может быть полезен при сериализации, например, с DataContractSerializer
(с добавлением некоторых атрибутов), поскольку многие сериализаторы по-прежнему будут искать частные средства доступа. Это избавляет нас от необходимости украшать наше внутреннее состояние (foo
), но дает фанеру конфиденциальности set
.
В конечном итоге все, что угодно можно обойти и назначить с помощью отражения, поэтому личное set
предназначено только для предотвращения случайного повреждения данных.