【问题标题】:How can I best check if A xor B are null?如何最好地检查 A xor B 是否为空?
【发布时间】:2016-01-06 22:49:41
【问题描述】:

检查只有 A 为空还是只有 B 为空的最佳方法是什么?我一直在尝试许多不同的方法来找到感觉干净的东西,这就是它变得多么复杂:

bool CheckForNull(object a, object b)
{
    if(a == null && b == null)
    {
        return false;
    }
    if(a == null || b == null)
    {
        return true;
    }
    return false;
}

我最好的(也是最明显的)版本是:

bool CheckForNull(object a, object b)
{
    return a == null && b != null || a != null && b == null;
}

但我也不喜欢那样。 (当然可以加括号...)

有没有我从未学过的标准方法?

【问题讨论】:

    标签: c# null boolean-logic xor


    【解决方案1】:

    这个呢:

    return (a == null) != (b == null);
    

    【讨论】:

      【解决方案2】:

      如果你需要/想要使用异或,你可以使用:

      return (a == null) ^ (b == null);
      

      但要使其发挥作用,true 必须评估为相同的“值”。

      但在这种情况下,我想我会尽可能简单。您的第二个版本实际上看起来并没有那么糟糕:

      return a == null && b != null || a != null && b == null;
      

      并且有可能提前退出。 (如果幸运的话,编译器甚至可以将其优化为并行执行(指令流水线)。

      【讨论】:

      • True 必须评估为相同的值?手表是什么意思?什么时候真不等于真?
      • @Evorlor 根据语言的不同,任何不为零的东西都可以评估为真(0 为假,其他一切为真)。因此,如果您的左侧 'true' 为 1,右侧为 2,则 xor 将无法按预期工作。
      • 问题有 c# 标签。无需担心哪种语言。
      【解决方案3】:

      你可以使用异或运算符

      bool CheckForNull(object a, object b)
      {
          return (a == null ^ b == null);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-04
        • 2014-05-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-01
        • 1970-01-01
        • 2013-09-02
        • 1970-01-01
        相关资源
        最近更新 更多