C#-级联的;“不为空”;条件

C#-级联的;“不为空”;条件,c#,optimization,multiple-conditions,C#,Optimization,Multiple Conditions,我想问一下在级联条件下如何改进代码的技巧,在这种情况下,您必须询问属性中的属性是否为null 只是一个简单的虚拟示例: public class ClassA { public ClassB classB { get; set; } } public class ClassB { public List<ClassC> classesC { get; set; } } public class ClassC { public ClassD classD { g

我想问一下在级联条件下如何改进代码的技巧,在这种情况下,您必须询问属性中的属性是否为null

只是一个简单的虚拟示例:

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; }
}
请注意,我并不是在寻找使用
try
block-and-catch-NullException的解决方案

谢谢。

您可以使用,
?。

请注意,您可能还希望使用
FirstOrDefault()
而不是
First()
First()
将在集合为空时抛出,但
FirstOrDefault()
将返回默认值(对于引用类型,
null

您可以将其与一个简单的方法结合起来,使事情简单化一点:

if (classA?.classB?.classesC?.FirstOrDefault()?.classD?.value is { } x)
{
    return x;
}
这里的
{}
模式表示“一个非空对象”。

您可以使用,
?。

请注意,您可能还希望使用
FirstOrDefault()
而不是
First()
First()
将在集合为空时抛出,但
FirstOrDefault()
将返回默认值(对于引用类型,
null

您可以将其与一个简单的方法结合起来,使事情简单化一点:

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

这里的
{}
模式意味着“一个非空对象”。

使用空传播操作符
来安全地访问值

var val = classA?.classB?.classesC?.FirstOrDefault()?.classD?.value;
请记住,它将返回一个可为空的数据类型。如果要为不可为空的变量(如int)赋值,请使用以下命令:

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

您可以阅读更多内容

使用空传播运算符
安全地访问值

var val = classA?.classB?.classesC?.FirstOrDefault()?.classD?.value;
请记住,它将返回一个可为空的数据类型。如果要为不可为空的变量(如int)赋值,请使用以下命令:

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

您可以阅读更多的

elvis操作符???,正如@Selvin提到的:顺便说一句,
First()
将在没有元素时抛出。。。你应该考虑使用<代码> FrStReDeFulult()/Case>埃尔维斯运算符????作为@ Selvin所提到的:BTW <代码>第一个()/<代码>将在没有元素时抛出…你应该考虑使用<代码> FrStReDeFulult()<代码>伟大,正是我所要寻找的。谢谢!太好了,正是我想要的。谢谢!