Я согласен с мнением Марка Симана о том, что Автоматические свойства в некоторой степени злы , поскольку они нарушают инкапсуляцию. Однако мне нравится лаконичный синтаксис, удобочитаемость и удобство, которые они приносят.
Цитирую:
public string Name { get; set; }
Проблема с кодом фрагмента не в том, что он содержит слишком много церемония. Проблема в том, что он нарушает инкапсуляцию. Фактически
«[…] геттеры и сеттеры не достигают инкапсуляции или информации сокрытие: они представляют собой узаконенный языком способ их нарушения »
Джеймс О. Коплиен и Гертруда Бьёрнвиг. Бережливая архитектура. Вайли. 2010. с. 134.
В большинстве случаев добавление ненулевого защитного предложения достаточно для установщика свойств, и я хотел бы знать, есть ли лучший способ сделать это, чем один из следующих. Под «лучше» я подразумеваю более сжатый / менее повторяющийся способ.
Использование контрактов кода:
private string _username;
public virtual string Username
{
get { return _username; }
set
{
Contract.Requires(value != null);
_username = value;
}
}
Использование vanilla .NET:
private string _username;
public virtual string Username
{
get { return _username; }
set
{
if (value == null) throw new ArgumentNullException("Username");
_username = value;
}
}