具有非null保护子句的自动实现的属性?

Can*_*cer 16 c# automatic-properties code-contracts guard-clause

我同意马克·西曼的观点,即自动属性在某种程度上是邪恶的,因为它们打破了封装.但是,我确实喜欢它们带来的简洁语法,可读性和便利性.

我引用:

public string Name { get; set; }
Run Code Online (Sandbox Code Playgroud)

代码片段的问题并不在于它包含太多的仪式.问题是它破坏了封装.事实上

"[...] getter和setter没有实现封装或信息隐藏:它们是一种语言合法化的方式来违反它们."

James O. Coplien和GertrudBjørnvig.精益建筑.威利.2010. p.134.

大多数情况下,添加一个非null保护子句对于属性设置器来说已经足够了,我想知道是否有比下面的更好的方法.更好的是,我的意思是更简洁/更少重复.

使用代码合同:

private string _username;
public virtual string Username
{
    get { return _username; }
    set 
    {  
        Contract.Requires(value != null);
        _username = value; 
    }
}
Run Code Online (Sandbox Code Playgroud)

使用vanilla .NET:

private string _username;
public virtual string Username
{
    get { return _username; }
    set 
    {
        if (value == null) throw new ArgumentNullException("Username");
        _username = value; 
    }
}
Run Code Online (Sandbox Code Playgroud)

Hen*_*man 7

我将引用代码合同手册第2.3.1节:

public int MyProperty { get; private set ; }

[ContractInvariantMethod]
private void ObjectInvariant () 
{
      Contract. Invariant ( this.MyProperty >= 0 );
      ...
}
Run Code Online (Sandbox Code Playgroud)