C#-空检查方法

C#-空检查方法,c#,null,nullable,C#,Null,Nullable,检查值是否为空的首选方法是什么 假设我们有一些实体,它有属性,可以是null(其中一些或全部) 我希望在运行时检查这一点,如果某个属性实际上是null 您会使用simpleEntity.Property!=null在这种情况下检查,或者您会实现一个特定的方法,比如 bool HasProperty() { return Property != null; } 您会选择什么以及为什么选择?只需检查属性本身是否为null,无需为此创建方法。属性实际上只是由编译器生成的方法。只要检查属性本身是

检查值是否为空的首选方法是什么

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

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

您会使用simple
Entity.Property!=null
在这种情况下检查,或者您会实现一个特定的方法,比如

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

您会选择什么以及为什么选择?

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

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

我会选择编写一个单独的
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); }
}
private List someStrings=null;
公共列表字符串{
得到{
if(someStrings==null)
someStrings=新列表();
返回一些字符串;
}
}
公共bool HasSomeStrings{
获取{return(someStrings!=null&&someStrings.Count>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); }
}
private List someStrings=null;
公共列表字符串{
得到{
if(someStrings==null)
someStrings=新列表();
返回一些字符串;
}
}
公共bool HasSomeStrings{
获取{return(someStrings!=null&&someStrings.Count>0);}
}

我只检查
null
,因为每个可为null的类型在内部都与您描述的完全相同(但内部方法称为
HasValue
,而不是
HasProperty
):


我只检查
null
,因为每个可为null的类型在内部都与您描述的完全相同(但内部方法称为
HasValue
,而不是
HasProperty
):


如果属性是非公共的,那么您需要一个类似HasProperty()的方法。另外,如果您以另一种方式实现“nullness”,那么最好有一个HasProperty()方法。

如果属性是非公共的,那么您需要一个类似HasProperty()的方法。另外,如果您以另一种方式实现“nullness”,那么最好有一个HasProperty()方法。

没有模式可以涵盖这一点。事实上,你所做的任何尝试都可以被认为是一种反模式

嘿,不要检查属性是否为null,请使用is[property Name]null属性


嗯,没有。

没有模式可以涵盖这一点。事实上,你所做的任何尝试都可以被认为是一种反模式

嘿,不要检查属性是否为null,请使用is[property Name]null属性


嗯,不。

空值不一定不好。我认为这完全取决于你为什么需要检查null来决定你应该如何检查它。

null不一定是坏的。我认为这完全取决于您为什么需要检查null来确定应该如何检查它。

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

  • 具有包含值的属性,该值可能为
    null
  • 另一个属性前缀为
    Has
    ,其余属性包含原始属性名称,该名称确定另一个属性是否为非空
  • 如果在
    null
  • 在这个例子中是

    SomeType Property { 
      get { 
        Contract.Requires(HasProperty);
        return _property; }
    }
    
    bool HasProperty {
      get { return _property != null; }
    }
    
    这背后的原因是C#没有一种标准的方法来描述一个值是否可以为null。有许多不同的惯例和技术可用,但根本没有标准。不理解值周围的
    null
    语义会导致错过
    null
    检查,最终导致
    NullReferenceExceptions

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

    我尝试过的其他解决方案

  • 什么都不做:这只是一次又一次的失败
  • 使用显式的
    可能
    选项
    键入F#的风格。这是可行的,但我发现我从从未做过函数式编程的开发人员那里得到了很多回击,这导致了完全支持#1的想法被拒绝
    对于可以为
    null
    的属性值,我倾向于执行以下操作

  • 具有包含值的属性,该值可能为
    null
  • 另一个属性前缀为
    Has
    ,其余属性包含原始属性名称,该名称确定另一个属性是否为非空
  • 如果在
    null
  • 在本例中