这两者是否等价:
if (null==myobject)
{
//do something
}
和
if (myobject==null)
{
//do something
}
或者它们会生成不同的代码吗?
在99%的情况下,这段代码是等效的。
唯一的例外是当涉及对象的类型重写了==运算符时。这种情况下可能会引入一个bug,在其中一个参数为null时会出现问题。
我之前见过一个特定的例子:
public static bool operator==(Student left, Student right) {
return left.Equals(right);
}
如果 null 位于左侧,这将会失败,但如果 null 位于右侧,则可能不会失败。
虽然这是一个相当边缘的情况。
if((object)left == null)
或 if(ReferenceEquals(left, null))
。前者可能更高效。 - yfeldblumreturn right.Equals(left);
,然后如果 right
学生为 null
(myobject == null
),代码将崩溃。 - Steven Liekensnull == student
和student == null
都将调用重载的==
运算符。因此,我认为这个答案是错误的。 - Dmytro Shevchenkoif
"语句中将常量放在左边的形式是从C/C++遗留下来的,因为在这些语言中,你可以在if语句中使用任意表达式。if (foo = 0)
会编译失败。if (wasEnabled == isEnabled()) ...
- Roman StarkovThe
if (null==myobject) {
这是一种安全的编写if语句的方法。它源于C/C++,其中条件是一个被评估为int
的表达式。如果结果为零,则表示false
,否则为true
。你可以编写类似以下语句:
if (variable == 1) {
if (variable = 1) {
在这种情况下,您有一个总是评估为1且因此始终为真的赋值。
您可以编译并运行它,但结果可能不是您预期的。因此,C / C ++程序员开始编写类似以下内容的代码:
if (1 == variable) {
如果您错过了它,或者希望减少混乱,也可以为您的C#
类启用C语言
风格的空值检查:
class MyObj
{
public void implicit_null_comparison_demo()
{
MyObj mo = null;
// ...
if (mo) // <-- like so (can also use !mo)
{
// it's not null...
}
else
{
// it's null...
}
}
public static implicit operator bool(MyObj mo)
{
return (Object)mo != null;
}
};
=
错误地被用于相等测试 ==
,这在 C# 中通常会标记为语法错误,而不像 C 和 **C++**。 - Glenn Slayden正如其他人指出的那样,它们基本上是等效的。
你还应该看一下: http://en.wikipedia.org/wiki/Null_Object_pattern
它是一个非常有用的替代方法,可以避免简单地检查空引用。
除非你重载了 ==,否则两种情况都会产生相同的结果。