写作总是让我觉得不对
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 == null和obj != 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#中编译.
这不是任何方式的风格或协议问题.
是否有任何非主观原因使用一个而不是另一个?
(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)
这不是我所谓的可读代码.