在C#中检查空值对象的最佳语法是什么

时间:2009-05-22 12:32:59

标签: c#

我总是觉得写错了

if (MyObject)
    // do something

或逆转

if (!MyObject)
    // do something

但是你可以说它比

更简洁
if (MyObject != null)
    // do something

if (MyObject == null)
    // do something

是否有任何非主观理由使用其中一个?

6 个答案:

答案 0 :(得分:36)

在C#中,你无法做到

if (MyObject) 

检查null。这是编译时错误(如果类没有隐式布尔转换运算符)。

if (!MyObject)
如果类没有重载operator !以返回布尔值(或者可以隐式地转换为布尔值的值),则

也无效。

所以你必须坚持obj == nullobj != null

总而言之,非主观原因是能够编译您的代码!

更新(故事):

曾几何时,在古代C中,没有bool类型。零被视为false,并且每个非零值都被视为true。你可以写

while(1) { }

创建一个无限循环 你也可以做像

这样的事情
int n  = 10;
while (n--) { }

有一个执行n次的循环。这个策略的问题是:

int x = 10;
if (x = 0) { // bug: meant to be x == 0
}

你错过了一个角色并且你创造了一个错误(大多数现代C编译器会在这个语句上发出警告,但它仍然是有效的C语言。)

这就是你看到像

这样的代码的原因
if (5 == variable) 

if (NULL == pObj)

在许多地方,因为它不容易出现上述错误。

C#设计人员决定要求 布尔表达式作为ifwhile等的条件,并且不允许转换类型(除非他们明确声明一个不鼓励的重载运算符)布尔值以减少错误的机会。所以像:

object x = null;
if (x) { }

int y = 10;
if (y) { }
while (y--) { }

在C中有效,不能在C#中编译 这不是风格或协议的问题。

答案 1 :(得分:5)

  

是否有任何非主观原因   使用一个而不是另一个?

(1)和(2)不编译的事实是一个非主观的理由,足以不使用它们。

所以我们留下了(3)和(4):

if (MyObject != null)
    // do something

if (MyObject == null)
    // do something

这取决于你是否想要在MyObject为null(4)时执行某些操作,或者它是否为null(3)。 显然这不是一种风格选择。采用始终相同的“风格”是荒谬的,因为如果你想要其他条件你必须做的事情:

    if (MyObject == null) // style policy
    {
        // nothing here
    }
    else
    {
        // do something
    }

这不是我所谓的可读代码。

答案 2 :(得分:2)

在我看来,这种情况下的一些冗长是的事情。如果你被允许同时做这两件事就是这种情况,这实际上是不可能的,正如Mehrdad指出的那样。 “隐式”空检查(即if (MyObject))甚至无法在C#中编译。

if (MyObject == null)
    // do something

然而,这与使用整数检查的情况非常相似。这里有两个等价的选项(在C中编译和运行都很好,但不是 C#,除非我是错误的是:

if (myInt)
    // do something

if (myInt > 0)
    // do something

我总是在这里寻找第二个选项,纯粹是为了清晰(它不能被误认为是bool!),尽管你经常会在代码中看到前面的“隐式”检查。

答案 3 :(得分:2)

在C#中,if语句需要一个布尔表达式。

因此,在上面的示例中,使用if(myObject)来测试null实际上是错误的。你需要做更详细的if(myObject==null)

答案 4 :(得分:1)

这取决于个人喜好。理想情况下,在C#中,要检查null,请使用以下语法 -

if (MyObject != null)
    //Do Something.

答案 5 :(得分:1)

如果你只是想为一个对象设置一个默认值,如果它是null,你可以使用c#3.0 ??操作

代码:

MyType _myObject
if (SomeObject==null)
  _myObject = defaultObjectValue
else
  _myObject = SomeObject

可以写成

_myObject = SomeObject ?? defaultObjectValue;

这基本上意味着如果SomeObject存在,请使用它,如果不存在,则使用默认值。