在回顾一些代码时,我看到:
if (null == condition) { ... }
我也看到了:
if (condition == null) { ... }
我似乎记得在左侧有一个null有一个优点,但是我不记得它,并且认为它是一个较旧的运行时项目,它已经被更新的.NET运行时优化了.我倾向于使用后者的无效检查,所以前者引起了我的注意.
那么这是一个风格问题,还是在评估的左侧或右侧有空的优势?
解决方法
它可以在三种情况下产生影响.
一个是条件= null的错误在if中有效.这在C风格的语言中更常见,它允许在if(值为false)中使用null,这是大多数,但不是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这样的类型更有价值,它们使我们现在使用bool的方式表示true,false或null? ).
因此,这种情况在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; } }
由于某些原因,隐式运算符值得避免,但这比第一个例子稍微有点可能,但仍然不太常见.
另一个是if ==以非对称方式过载:
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放在第一位的人倾向于从语言中汲取它,而这些语言更有意义.