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
我想询问如何在级联条件的情况下改进代码的任何提示,您必须询问 属性 内部的 属性 是否不为空。
只是简单的虚拟示例:
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