检查值是null
?
假设我们有一些实体,它有属性,可以是null
(其中一些或全部)。
我希望在运行时检查这个,如果某个属性实际上是null
。
在这种情况下你会使用简单的Entity.Property != null
检查吗?或者你会实施一个特定的方法,比如说
bool HasProperty() {
return Property != null;
}
您会选择什么?为什么?
答案 0 :(得分:3)
对于可以null
的属性值,我的首选是执行以下操作
null
Has
,其余属性包含原始属性名称,以确定其他属性是否为非空null
在这个例子中它将是
SomeType Property {
get {
Contract.Requires(HasProperty);
return _property; }
}
bool HasProperty {
get { return _property != null; }
}
这背后的原因是C#没有标准的方式来描述一个值是否可以为null。有许多不同的惯例和技术可用,但根本没有标准。如果不了解值周围的null
语义,则会导致错过null
次检查,最终导致NullReferenceExceptions
。
我发现表达这一点的最好方法是通过添加null
属性使类型本身的Has
特性显式化,当且仅当属性可以是{{ 1}}。这不是一个完美的解决方案,但我发现它在大型项目中运行良好。
我尝试过的其他解决方案
null
或Maybe<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
):
答案 5 :(得分:0)
如果Property不是公共的,那么你需要像HasProperty()这样的方法。此外,如果以另一种方式实现“nullness”,那么拥有HasProperty()方法也是一件好事。
答案 6 :(得分:0)
Null不一定是坏事。我认为这完全取决于为什么你需要检查null以确定 你应该检查它。