方法参数中的C#Null条件运算符

时间:2018-04-12 10:51:29

标签: c# short-circuiting null-conditional-operator

我有以下方法:

float myMethod(MyObject[][] myList) 
{
      float a = 0;
      if (myListProcessingMethod(myList?.Where(x => x.mySatisfiedCondition()).ToList()))
      {
            a = 5;
      }
      return a;
}

bool myListProcessingMethod(List<MyObject[]> myList)
{
      bool isSuccess = false;
      if (myList.Any())
      {
            isSuccess = true;
      }
      return isSuccess;
}

我考虑这个条件:

if (myListProcessingMethod(myList?.Where(x => x.mySatisfiedCondition()).ToList()))

我将自己的条件重构为:

if (myList?.Length != 0)
{
      if (myListProcessingMethod(myList.Where(x => x.mySatisfiedCondition()).ToList()))
      {
            a = 5;
      }
}

这两个条件是否相同?与传统方式的第一个NullConditionOperator相同的条件是什么?使用NullConditionalOperator进行第二次传统检查的条件是什么?

1 个答案:

答案 0 :(得分:3)

以下声明可能会崩溃。如果myList为空,则myList?.Length将为空,myList?.Length != 0将为 true 。这意味着myList.Where可能会因空引用异常而崩溃。

if (myList?.Length != 0)
{
  if (myListProcessingMethod(myList.Where(x => x.mySatisfiedCondition()).ToList()))
  {
        a = 5;
  }
}
你可能想要

if (myList?.Length > 0) 
...

仅当列表不为null且其长度大于0时,才会计算为 true