带有非空保护子句的自动实现属性

本文关键字:实现 属性 子句 保护 | 更新日期: 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检查抛出异常)。

如果分配的数据无效(在你的算法设计中),

属性设置器应该给内部成员放置一个无效的值。错误检查和返回应该来自使用这个属性值

的方法