C# - 空检查方法

时间:2011-01-31 17:32:05

标签: c# null nullable

检查值是null

的首选方法是什么?

假设我们有一些实体,它有属性,可以是null (其中一些或全部)。

我希望在运行时检查这个,如果某个属性实际上是null

在这种情况下你会使用简单的Entity.Property != null检查吗?或者你会实施一个特定的方法,比如说

bool HasProperty() {
   return Property != null;
}

您会选择什么?为什么?

7 个答案:

答案 0 :(得分:3)

对于可以null的属性值,我的首选是执行以下操作

  1. 让属性包含可能为null
  2. 的值
  3. 让另一个属性前缀为Has,其余属性包含原始属性名称,以确定其他属性是否为非空
  4. 如果在null
  5. 时访问了断言,则将断言添加到原始属性中

    在这个例子中它将是

    SomeType Property { 
      get { 
        Contract.Requires(HasProperty);
        return _property; }
    }
    
    bool HasProperty {
      get { return _property != null; }
    }
    

    这背后的原因是C#没有标准的方式来描述一个值是否可以为null。有许多不同的惯例和技术可用,但根本没有标准。如果不了解值周围的null语义,则会导致错过null次检查,最终导致NullReferenceExceptions

    我发现表达这一点的最好方法是通过添加null属性使类型本身的Has特性显式化,当且仅当属性可以是{{ 1}}。这不是一个完美的解决方案,但我发现它在大型项目中运行良好。

    我尝试过的其他解决方案

    1. 什么都不做:这只是一遍又一遍地失败
    2. 在F#的风格中使用明确的nullMaybe<T>类型。这有效,但我发现我从没有完成函数式编程的开发人员那里得到了很多回击,并且导致完全拒绝这个想法而支持#1。

答案 1 :(得分:1)

只需检查属性本身是否为null,就不需要为此创建方法。属性实际上只是编译器生成的方法。

答案 2 :(得分:1)

没有任何模式可以涵盖这一点。事实上,你所做的任何尝试使这种“更容易”的行为都可以被视为一种反模式。

“嘿,不要检查属性是否为null,使用Is [Property Name] Null属性”

呃,不。

答案 3 :(得分:0)

我会选择只在属性自动初始化时才编写一个单独的Has*属性(即只是获取它可能会导致分配一个空集合)并且它会产生性能差异。如果获得该物业是便宜的(因为它应该是;在某些情况下,你不能让它有所作为,但是),不需要多余的Has方法。

所以没有一般​​情况:

public string Foo { get; set; }

但在某些情况下,这可能是一个好主意:

private List<string> someStrings = null;

public List<string> SomeStrings {
    get {
        if (someStrings == null)
            someStrings = new List<string>();
        return someStrings;
    }
}

public bool HasSomeStrings {
    get { return (someStrings != null && someStrings.Count > 0); }
}

答案 4 :(得分:0)

我只针对null进行检查,因为每个可空类型都在内部完全按照您的描述(但内部方法称为HasValue而不是HasProperty):

http://msdn.microsoft.com/de-de/library/b3h38hb0.aspx

答案 5 :(得分:0)

如果Property不是公共的,那么你需要像HasProperty()这样的方法。此外,如果以另一种方式实现“nullness”,那么拥有HasProperty()方法也是一件好事。

答案 6 :(得分:0)

Null不一定是坏事。我认为这完全取决于为什么你需要检查null以确定 你应该检查它。