Я согласен с мнением Марка Симана о том, что Автоматические свойства являются чем-то злым , поскольку они нарушают инкапсуляцию. Однако мне нравится лаконичный синтаксис, удобочитаемость и удобство, которые они приносят.
Цитирую:
public string Name { get; set; }
Проблема с фрагментом кода не в том, что он содержит слишком много
церемония. Проблема в том, что это нарушает инкапсуляцию. На самом деле
«[…] методы получения и установки не достигают инкапсуляции или информации
сокрытие: они являются легитимным языком способ их нарушения ».
Джеймс О. Коплин и Гертруда Бьёрнвиг. Бережливая архитектура. Wiley. 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;
}
}