【问题标题】:C# - cascade of "not null" conditionsC# - “非空”条件的级联
【发布时间】:2021-03-15 14:00:10
【问题描述】:

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

只是简单的虚拟示例:

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;

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

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 的解决方案。

谢谢。

【问题讨论】:

标签: c# optimization multiple-conditions


【解决方案1】:

您可以使用null conditional operator?.

请注意,您可能还想使用FirstOrDefault() 而不是First():如果集合为空,First() 将抛出,但FirstOrDefault() 将返回默认值(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;
}

{ } 模式在这里的意思是“一个不为空的对象”。

【讨论】:

  • 太好了,正是我想要的。非常感谢!
【解决方案2】:

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

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

请记住,它将返回一个可为空的数据类型。如果您想为 int 等不可为空的变量赋值,请使用:

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

您可以阅读更多here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 2017-11-14
    • 2012-05-03
    相关资源
    最近更新 更多