Я согласен с мнением Марка Сеэна о том, что Автоматические свойства несколько злы, поскольку они разрушают инкапсуляцию. Однако мне нравится сжатый синтаксис, удобство чтения и удобство, которое они приносят.
Я цитирую:
public string Name { get; set; }
Проблема с фрагментом кода не в том, что он содержит слишком много церемония. Проблема в том, что он прерывает инкапсуляцию. Фактически
"[...] получатели и сеттеры не добиваются инкапсуляции или информации скрывая: они являются легитимным языком, чтобы нарушать их.
Джеймс О. Коплиен и Гертруд Бьёрнвиг. Бережливая архитектура. Wiley. 2010. p. 134.
В большинстве случаев добавление предложения non-null guard достаточно хорошо для установщика свойств, и я хотел бы знать, есть ли лучший способ сделать это, чем один из ниже. К лучшему я имею в виду более сжатый/менее повторяющийся способ.
Использование кодовых контрактов:
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;
}
}