我总是觉得写错了
if (MyObject)
// do something
或逆转
if (!MyObject)
// do something
但是你可以说它比
更简洁if (MyObject != null)
// do something
if (MyObject == null)
// do something
是否有任何非主观理由使用其中一个?
答案 0 :(得分:36)
在C#中,你无法做到
if (MyObject)
检查null
。这是编译时错误(如果类没有隐式布尔转换运算符)。
if (!MyObject)
如果类没有重载operator !
以返回布尔值(或者可以隐式地转换为布尔值的值),则也无效。
所以你必须坚持obj == null
和obj != 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#设计人员决定要求 布尔表达式作为if
,while
等的条件,并且不允许转换类型(除非他们明确声明一个不鼓励的重载运算符)布尔值以减少错误的机会。所以像:
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存在,请使用它,如果不存在,则使用默认值。