Подтвердить что ты не робот

Автоматически реализованные свойства с необязательным предложением о защите?

Я согласен с мнением Марка Сеэна о том, что Автоматические свойства несколько злы, поскольку они разрушают инкапсуляцию. Однако мне нравится сжатый синтаксис, удобство чтения и удобство, которое они приносят.

Я цитирую:

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; 
    }
}
4b9b3361

Ответ 1

Я просто приведу "Кодовые контракты" , раздел; 2.3.1:

public int MyProperty { get; private set ; }

[ContractInvariantMethod]
private void ObjectInvariant () 
{
      Contract. Invariant ( this.MyProperty >= 0 );
      ...
}

Ответ 2

Вы можете использовать аспекты PostSharp, чтобы украсить свойство setter нулевой проверкой:

http://www.sharpcrafters.com/blog/post/5-Ways-That-Postsharp-Can-SOLIDify-Your-Code-Lazy-Loading-of-Dependencies.aspx

Как создать проверку аспекта для нулевых ссылок на все методы в классе в postharp

http://magpie.sytes.net/jesperhogstrom/2010/11/compiler-safe-null-checking-of-arguments-with-aspects/

Ответ 3

Я бы предположил, что свойства - это только буфер памяти с точки зрения пользователя. только когда в пользовательском коде вызывается метод (действие), тогда проверка достоверности буфера свойств должна быть проверена (например, исключение исключает исключение).

ваш установщик свойств должен поместить недопустимое значение для внутреннего члена, если назначенные данные недействительны (в вашем алгоритме). проверка и возврат ошибки должны исходить из метода, использующего это значение свойства