C# · 12月 26, 2021

c# – 应在左侧或右侧检查null

在回顾一些代码时,我看到: 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放在第一位的人倾向于从语言中汲取它,而这些语言更有意义.