Я читал во многих местах, что публичное предоставление полей не является хорошей идеей, потому что если вы позже захотите перейти к свойствам, вам придется перекомпилировать весь код, который использует ваш класс.
Однако, в случае неизменяемых классов, я не понимаю, почему вам когда-либо понадобится перейти к свойствам - вы не собираетесь добавлять логику в 'set' в конце концов.
Есть мысли по этому поводу, я что-то упустил?
Пример разницы, для тех, кто читает код легче, чем текст :)
//Immutable Tuple using public readonly fields
public class Tuple<T1,T2>
{
public readonly T1 Item1;
public readonly T2 Item2;
public Tuple(T1 item1, T2 item2)
{
Item1 = item1;
Item2 = item2;
}
}
//Immutable Tuple using public properties and private readonly fields
public class Tuple<T1,T2>
{
private readonly T1 _Item1;
private readonly T2 _Item2;
public Tuple(T1 item1, T2 item2)
{
_Item1 = item1;
_Item2 = item2;
}
public T1 Item1 { get { return _Item1; } }
public T2 Item2 { get { return _Item2; } }
}
Конечно, вы можете использовать авто-свойства (public T1 Item1 { get; private set; }
), но это только дает вам «согласованную неизменность», а не «гарантированную неизменность» ...