Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 嵌套对象中的空检查_C#_Null - Fatal编程技术网

C# 嵌套对象中的空检查

C# 嵌套对象中的空检查,c#,null,C#,Null,我有几个由API返回的普通旧C#对象,其中嵌套了几层POCO。我需要访问这些结构中包含的字段,但由于API在数据丢失时将这些嵌套对象保留为null,因此我发现自己必须进行大量的null检查才能找到真正需要的字段 if(obj != null && obj.Inner != null && obj.Inner.Innerer != null) { ... } 我提出的最短形式是使用三元运算符 obj != null && obj.Inner !=

我有几个由API返回的普通旧C#对象,其中嵌套了几层POCO。我需要访问这些结构中包含的字段,但由于API在数据丢失时将这些嵌套对象保留为null,因此我发现自己必须进行大量的null检查才能找到真正需要的字段

if(obj != null && obj.Inner != null && obj.Inner.Innerer != null) { ... }
我提出的最短形式是使用三元运算符

obj != null && obj.Inner != null && obj.Inner.Innerer != null ? obj.Inner.Innerer.Field : null;
C#有没有办法做到这一点而不必写下所有这些比较?我真的想要一些简短的东西,比如:

obj.Inner.Innerer.Field ?? null;

但这只会检查字段是否为空。

请看一下这个非常聪明和优雅的解决方案:


这并不漂亮,但您可以在代码中编写访问器函数来封装
null
检查,因此您只需在一个地方执行。 例如


这样您就可以这样调用它:
if(myObject.getInner()!=null).
。您必须创建许多这样的函数,但至少它会将空检查的“goreyness”移动到单个位置。

怎么样?嗯,
f
方法肯定太混乱了。它使代码行更短,但我认为三元代码更容易理解。
tc
方法非常接近,但是在方法中抛出了一个异常,这是一个性能损失(特别是与空检查相比)。非常接近,但不完全是我所希望的。一个想法是,您可以尝试直接访问Inner.Inner.Field,同时尝试捕获空异常。如果沿途的任何内容都为null,那么将捕获异常并返回null。否则返回值。不,异常在任何现代计算机上都不会是“性能损失”。对于“异常行为”,您不会在异常上循环数百万次。@KappaG3只有当getter只是这样一个支持字段的返回时才有可能,但在get方法中有大量工作的实现。有趣的是,但要使这种链接工作,我需要修改从API返回的对象,而我无法控制它们。
Innerer GetInnerer()
{
  if(obj != null && obj.Inner != null && obj.Inner.Innerer != null)
  {
    return obj.Inner.Innerer;
  }

  return null;
}