繁体   English   中英

应该在左侧或右侧检查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(如下面的注释中所述),所以这实际上导致问题的唯一情况是你的类型是bool

它可以在三种情况下产生影响。

一个是condition = 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?的方式表示truefalsenull bool? )。

因此,这种情况在C#中相当微不足道。

另一个是类似的,如果有一个隐式转换为bool或一个类型反过来实现truefalse运算符:

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放在第一位的人倾向于从语言中汲取它,而这些语言更有意义。

无论如何(null == condition)编译,使用像null作为第一个(左)操作数的示例性值都是反直觉的。 相反,第一个操作数应该建议您要评估的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM