我同意马克·西曼的观点Automatic Properties are somewhat evil因为它们破坏了封装。但是我确实喜欢它们带来的简洁语法,可读性和便利性。
我引用:
public string Name { get; set; }
代码段的问题不在于它包含太多 仪式。问题是它破坏了封装。事实上
“[...] 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;
}
}
使用vanilla .NET:
private string _username;
public virtual string Username
{
get { return _username; }
set
{
if (value == null) throw new ArgumentNullException("Username");
_username = value;
}
}
答案 0 :(得分:7)
我将引用Code Contracts手册,§2.3.1:
public int MyProperty { get; private set ; }
[ContractInvariantMethod]
private void ObjectInvariant ()
{
Contract. Invariant ( this.MyProperty >= 0 );
...
}
答案 1 :(得分:3)
您可以使用PostSharp中的方面来使用空检查来装饰属性设置器:
How to create an aspect checking for null references on all methods in a class in postsharp
答案 2 :(得分:0)
从用户的角度来看,我认为属性只是内存缓冲区。只有在用户代码中调用方法(动作)时,才应检查属性缓冲区的有效性(例如,空检查会抛出异常)。
如果分配的数据无效(在算法设计中),则属性设置器应将无效值放入内部成员。错误检查和返回应来自使用此属性值的方法