加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 04:05:13 所属栏目:百科 来源:网络整理
导读:在回顾一些代码时,我看到: if (null == condition) { ... } 我也看到了: if (condition == null) { ... } 我似乎记得在左侧有一个null有一个优点,但是我不记得它,并且认为它是一个较旧的运行时项目,它已经被更新的.NET运行时优化了.我倾向于使用后者的无效
在回顾一些代码时,我看到:
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放在第一位的人倾向于从语言中汲取它,而这些语言更有意义.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读