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

Nic*_*len 4 c#

写作总是让我觉得不对

if (MyObject)
    // do something
Run Code Online (Sandbox Code Playgroud)

或者逆转

if (!MyObject)
    // do something
Run Code Online (Sandbox Code Playgroud)

但是你可能会认为它不那么冗长

if (MyObject != null)
    // do something

if (MyObject == null)
    // do something
Run Code Online (Sandbox Code Playgroud)

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

Meh*_*ari 36

在C#中,你无法做到

if (MyObject) 
Run Code Online (Sandbox Code Playgroud)

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

if (!MyObject)
Run Code Online (Sandbox Code Playgroud)

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

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

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

更新(故事):

曾几何时,在古代C中,没有bool类型.考虑零,并考虑false每个非零值true.你可以写

while(1) { }
Run Code Online (Sandbox Code Playgroud)

创建一个无限循环.
你也可以这样做

int n  = 10;
while (n--) { }
Run Code Online (Sandbox Code Playgroud)

有一个执行n时间的循环.这个策略的问题是:

int x = 10;
if (x = 0) { // bug: meant to be x == 0
}
Run Code Online (Sandbox Code Playgroud)

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

这就是你看到代码的原因

if (5 == variable) 

if (NULL == pObj)
Run Code Online (Sandbox Code Playgroud)

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

C#设计者决定需要一个布尔表达式作为条件if,while等等,并且不允许的类型铸造(除非它们明确声明一个重载操作,这是不鼓励)为布尔值,以减少错误的机会.所以像:

object x = null;
if (x) { }

int y = 10;
if (y) { }
while (y--) { }
Run Code Online (Sandbox Code Playgroud)

在C中有效,不要在C#中编译.
这不是任何方式的风格或协议问题.


Dan*_*nas 5

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

(1)和(2)不编译的事实是足以不使用它们的非主观原因.

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

if (MyObject != null)
    // do something

if (MyObject == null)
    // do something
Run Code Online (Sandbox Code Playgroud)

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

    if (MyObject == null) // style policy
    {
        // nothing here
    }
    else
    {
        // do something
    }
Run Code Online (Sandbox Code Playgroud)

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