带有非空保护子句的自动实现属性
本文关键字:实现 属性 子句 保护 | 更新日期: 2023-09-27 18:03:14
我同意Mark Seeman的观点,即自动属性在某种程度上是邪恶的,因为它们破坏了封装。但是我喜欢它简洁的语法,可读性和便利性。
我引用:
public string Name { get; set; }
代码段的问题不在于它包含太多仪式。问题是它破坏了封装。事实上
"[…]getter和setter不能实现封装或信息隐藏:它们是一种违反它们的语言合法方式。"
James O. Coplien &;格特鲁德Bjørnvig。精益建筑。威利》2010。p。134 .
大多数时候,添加一个非空保护子句对于属性设置器来说已经足够好了,我想知道是否有比下面的方法更好的方法。我说的更好,是指更简洁/更少重复的方式。
使用代码契约:
private string _username;
public virtual string Username
{
get { return _username; }
set
{
Contract.Requires(value != null);
_username = value;
}
}
使用。net:
private string _username;
public virtual string Username
{
get { return _username; }
set
{
if (value == null) throw new ArgumentNullException("Username");
_username = value;
}
}
我将引用Code Contracts手册,§2.3.1:
public int MyProperty { get; private set ; }
[ContractInvariantMethod]
private void ObjectInvariant ()
{
Contract. Invariant ( this.MyProperty >= 0 );
...
}
您可以使用PostSharp的aspect来用null检查来装饰属性setter:
http://www.sharpcrafters.com/blog/post/5-Ways-That-Postsharp-Can-SOLIDify-Your-Code-Lazy-Loading-of-Dependencies.aspx如何在postsharp
中创建一个方面检查类中所有方法的空引用http://magpie.sytes.net/jesperhogstrom/2010/11/compiler-safe-null-checking-of-arguments-with-aspects/从用户的角度来看,我认为属性只是内存缓冲区。只有当在用户代码中调用方法(操作)时,才应该检查属性缓冲区的有效性(例如,null检查抛出异常)。
如果分配的数据无效(在你的算法设计中),属性设置器应该给内部成员放置一个无效的值。错误检查和返回应该来自使用这个属性值