C#-级联的;“不为空”;条件
我想问一下在级联条件下如何改进代码的技巧,在这种情况下,您必须询问属性中的属性是否为null 只是一个简单的虚拟示例: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
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()<代码>伟大,正是我所要寻找的。谢谢!太好了,正是我想要的。谢谢!