应该在左侧或右侧检查 null
Should null be checked on the left or right hand side
在审查一些代码时,我看到:
if (null == condition) { ... }
而且我还看到了:
if (condition == null) { ... }
我似乎记得 null
在左侧有一个优势,但我不记得了,我认为它是一个较旧的运行时项目,已被较新的 .NET 优化掉运行时。我倾向于使用后者的空检查,所以前者引起了我的注意。
那么这是风格问题,还是 null
位于评估的左侧或右侧是否有优势?
C 风格语言中的经典原因是防止将等式 ==
错误键入为赋值 =
。您不能分配给常量 - 即以下是非法的,因此编译器将捕获错误:
if (false = condition) { ... }
虽然这是完全合法的(但可能不是作者的意图:
if (condition = false) { ... }
注意:这个问题在 C# 中是有限的(与 vanilla C 相比),因为 if
语句需要一个布尔值(如下面的评论中所述),所以这实际上导致问题的唯一情况是如果你类型是 bool
.
它可以在三种情况下发挥作用。
一个是 condition = null
的拼写错误在 if
中是有效的。这在允许 if
(值为 false
)中的 null
的 C 风格语言中更常见,这是大多数语言,但不是 C#。
可以在 C# 中创建具有这种效果的类型:
public class Test
{
public static bool operator true(Test x)
{
return true;
}
public static bool operator false(Test x)
{
return false;
}
}
void Main()
{
Test test = new test();
if (test = null)
{
Console.WriteLine("!");
}
}
很多时候重载这些运算符是没有意义的,尤其是自从 .Net 2.0 引入泛型以来(它对像 SqlBoolean
这样的类型有更多的价值,使值能够指示 true
, false
或 null
我们现在使用的方式 bool?
).
所以这种情况在 C# 中非常边缘。
另一个类似,如果隐式转换为 bool
或转换为反过来实现 true
和 false
运算符的类型:
void Main()
{
Test test = new Test();
if (test = null)
{
Console.WriteLine("!");
}
}
public class Test
{
public static implicit operator bool(Test x)
{
return true;
}
}
出于某些原因,隐式运算符值得避免,但这比第一个示例的可能性略大,但仍远未普遍。
还有一个是如果 ==
以非对称方式重载:
public class Test
{
public static bool operator == (Test x, Test y)
{
return ReferenceEquals(x, null);
}
public static bool operator !=(Test x, Test y)
{
return !(x == y);
}
}
void Main()
{
Test test = new Test();
if (test == null)
{
Console.WriteLine("This won't print.");
}
if (null == test)
{
Console.WriteLine("This will print.");
}
}
但由于非对称 ==
始终是错误,因此这取决于运算符中的错误是否会产生任何影响。这可能比第一种情况发生的频率稍高,但应该在发生时修复它,所以它更不值得关注。
因此,虽然它可以在 C# 中产生影响,但这种情况很少见,而且主要是基于其他人做了他们不应该做的事情。
因此,这主要是风格问题。将 null
放在首位的人往往是从它产生更大差异的语言中选择它的。
无论 (null == condition)
如何编译,使用像 null
这样的 示例性 值作为第一个(左)操作数是违反直觉的。相反,第一个操作数应该建议您打算评估什么。
在审查一些代码时,我看到:
if (null == condition) { ... }
而且我还看到了:
if (condition == null) { ... }
我似乎记得 null
在左侧有一个优势,但我不记得了,我认为它是一个较旧的运行时项目,已被较新的 .NET 优化掉运行时。我倾向于使用后者的空检查,所以前者引起了我的注意。
那么这是风格问题,还是 null
位于评估的左侧或右侧是否有优势?
C 风格语言中的经典原因是防止将等式 ==
错误键入为赋值 =
。您不能分配给常量 - 即以下是非法的,因此编译器将捕获错误:
if (false = condition) { ... }
虽然这是完全合法的(但可能不是作者的意图:
if (condition = false) { ... }
注意:这个问题在 C# 中是有限的(与 vanilla C 相比),因为 if
语句需要一个布尔值(如下面的评论中所述),所以这实际上导致问题的唯一情况是如果你类型是 bool
.
它可以在三种情况下发挥作用。
一个是 condition = null
的拼写错误在 if
中是有效的。这在允许 if
(值为 false
)中的 null
的 C 风格语言中更常见,这是大多数语言,但不是 C#。
可以在 C# 中创建具有这种效果的类型:
public class Test
{
public static bool operator true(Test x)
{
return true;
}
public static bool operator false(Test x)
{
return false;
}
}
void Main()
{
Test test = new test();
if (test = null)
{
Console.WriteLine("!");
}
}
很多时候重载这些运算符是没有意义的,尤其是自从 .Net 2.0 引入泛型以来(它对像 SqlBoolean
这样的类型有更多的价值,使值能够指示 true
, false
或 null
我们现在使用的方式 bool?
).
所以这种情况在 C# 中非常边缘。
另一个类似,如果隐式转换为 bool
或转换为反过来实现 true
和 false
运算符的类型:
void Main()
{
Test test = new Test();
if (test = null)
{
Console.WriteLine("!");
}
}
public class Test
{
public static implicit operator bool(Test x)
{
return true;
}
}
出于某些原因,隐式运算符值得避免,但这比第一个示例的可能性略大,但仍远未普遍。
还有一个是如果 ==
以非对称方式重载:
public class Test
{
public static bool operator == (Test x, Test y)
{
return ReferenceEquals(x, null);
}
public static bool operator !=(Test x, Test y)
{
return !(x == y);
}
}
void Main()
{
Test test = new Test();
if (test == null)
{
Console.WriteLine("This won't print.");
}
if (null == test)
{
Console.WriteLine("This will print.");
}
}
但由于非对称 ==
始终是错误,因此这取决于运算符中的错误是否会产生任何影响。这可能比第一种情况发生的频率稍高,但应该在发生时修复它,所以它更不值得关注。
因此,虽然它可以在 C# 中产生影响,但这种情况很少见,而且主要是基于其他人做了他们不应该做的事情。
因此,这主要是风格问题。将 null
放在首位的人往往是从它产生更大差异的语言中选择它的。
无论 (null == condition)
如何编译,使用像 null
这样的 示例性 值作为第一个(左)操作数是违反直觉的。相反,第一个操作数应该建议您打算评估什么。