C# - "not null" 条件级联

C# - cascade of "not null" conditions

我想询问如何在级联条件的情况下改进代码的任何提示,您必须询问 属性 内部的 属性 是否不为空。

只是简单的虚拟示例:

public class ClassA
{
    public ClassB classB { get; set; }
}
public class ClassB
{
    public List<ClassC> classesC { get; set; }
}
public class ClassC
{
    public ClassD classD { get; set; }
}
public class ClassD
{
    public string value { get; set; }
}

那么假设你想要得到这样一个值:classA.classB.classesC.First().classD.value;

是否有任何有效的方法可以做到这一点并确保在这些 类 中的任何一个为 null 时不会出现错误?而不是很多条件:

if (classA != null && classA.classB != null && classA.classB.classesC != null && classA.classB.classesC.First() != null && classA.classB.classesC.First().classD != null) return classA.classB.classesC.First().classD.value;

请注意,我不是在寻找使用 try 块和捕获 NullException 的解决方案。

谢谢。

您可以使用 null conditional operator?.

请注意,您可能还想使用 FirstOrDefault() 而不是 First():如果集合为空,First() 将抛出,但 FirstOrDefault() 将 return 默认值(null 在引用类型的情况下)。

var result = classA?.classB?.classesC?.FirstOrDefault()?.classD?.value;
if (result != null)
{
   return result;
}

您可以将其与简单的 pattern 结合使用,以稍微简化事情:

if (classA?.classB?.classesC?.FirstOrDefault()?.classD?.value is { } x)
{
    return x;
}

此处的 { } 模式表示“不为空的对象”。

使用 Null 传播运算符 ? 来安全地访问值。

var val = classA?.classB?.classesC?.FirstOrDefault()?.classD?.value;

请记住,它将 return 为可为 null 的数据类型。如果您愿意为不可为 null 的变量(例如 int)赋值,请使用:

var val = classA?.classB?.classesC?.FirstOrDefault()?.classD?.value ?? 0;

你可以阅读更多here