C#如何检查空值,可使用(value is null)或(null == value)。我们能否使用`is`运算符代替==运算符?

16

C#如何检查null(value is null)或者(null == value)。我们可以使用is运算符代替==运算符吗?

C# 7.0支持使用is运算符进行常量模式匹配。那么我们可以使用is null来检查所有的null吗?

除了null之外,对象是否也可能为空呢?


1
你为什么不自己尝试一下呢?这并不是很难的工作... - random
1
@random:虽然我同意原帖作者可以检查它是否有效,但这并不能像我们一样提供关于正在发生的事情的详细信息。 - Jon Skeet
1
虽然现在已经找到了更合适的重复问题,但我仍将我的答案保留在这里,因为它不会有任何影响。 - Jon Skeet
@JonSkeet,如果您这样做,就会得到很好的评分 ;) - MakePeaceGreatAgain
@HimBromBeere:由于声望上限的存在,这实际上不会对声望产生任何影响... <叹气> - Jon Skeet
显示剩余2条评论
1个回答

37

是的,您可以使用null的常量模式和is运算符来检查引用(或可空值类型值)是否为null

实际上,在C# 7中,我会说使用is null是测试null值的最流行的方式,因为它不使用任何用户定义的运算符。考虑以下示例:

string x = GetStringFromSomewhere();

if (x == null) { }  // Option 1
if (x is null) { }  // Option 2

在这里,选项1将调用string中定义的==运算符重载。虽然它应该会做你想要的事情(我预计即时编译器会对其进行优化),但这并不像你特别希望那样 - 你只是想测试x的值是否为null引用。这正是选项2所做的。

因此,如果您没有执行奇怪的自定义比较的类型,则可以使用is null进行所有null检查。可以编写一种类,以使x == nullx is null产生不同的结果,但这几乎总是设计(或实现)问题。

不存在对象被“empty”的概念 - 实际上,为null的不是object。暂且不论可为空的值类型,为null的是一个reference而不是一个对象 - null值表示对象不存在。在你的脑海中仔细区分对象和引用非常值得。

一些特定的对象类型有“empty”的概念 - 例如,字符串可以为空,或者集合可以为空 - 但这些类型有特定的方法来测试是否为空。没有general的概念指对象为空。


我有一种感觉,好像因为语言障碍失去了某些东西... 我认为“空”概念是指类似Python的东西,其中一个空列表返回false {if([]): //返回假}。 - Mars
@Mars:但是在C#中没有一个通用对象的概念。有空数组的概念,或者空列表等-但您需要具体检查它们。 - Jon Skeet
我知道。只是觉得这可能是这个问题的来源,即使它没有被问得很清楚。 - Mars
1
@Mars:在答案的结尾添加了一段话来帮助解决这个问题。 - Jon Skeet
1
@EnricoMassone:关键是,如果你希望== null有时对非空值返回true(一种“逻辑null”),那么如果你将该比较改为is null,它就不会表现出相同的行为。但是,如果== null仅在左操作数实际上是null引用时返回true,那么只需使用is null即可。 - Jon Skeet
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接