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)
我将引用代码合同手册第2.3.1节:
public int MyProperty { get; private set ; }
[ContractInvariantMethod]
private void ObjectInvariant ()
{
Contract. Invariant ( this.MyProperty >= 0 );
...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4187 次 |
| 最近记录: |