繁体   English   中英

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

[英]What is the best syntax for checking for null value objects in C#

写作总是让我觉得不对

if (MyObject)
    // do something

或者逆转

if (!MyObject)
    // do something

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

if (MyObject != null)
    // do something

if (MyObject == null)
    // do something

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

在C#中,你无法做到

if (MyObject) 

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

if (!MyObject)

如果类没有重载operator !也是无效的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
}

你错过了一个角色并且你创建了一个bug(大多数现代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)和(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
    }

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

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

if (MyObject == null)
    // do something

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

if (myInt)
    // do something

if (myInt > 0)
    // do something

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

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

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

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

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

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

编码:

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

可以写成

_myObject = SomeObject ?? defaultObjectValue;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM