C# 如何解读这样的结构?

C# 如何解读这样的结构?,c#,.net,C#,.net,在我的代码中,我跳进了这样一个东西,我真的不知道如何阅读它。如果有人能帮我,那就太好了:) 首先将其拆分为3个表达式,用??分隔: Company?.Call?.SingleOrDefault(cf => cf.Name == Client?.CallID) ?? Company?.Call?.SingleOrDefault(cf=>cf.IsDefault) ?? new CallData(); 整个表达式的返回值将是第一个返回非null值的表达式 在每个段中,一旦使用?。访问的

在我的代码中,我跳进了这样一个东西,我真的不知道如何阅读它。如果有人能帮我,那就太好了:)


首先将其拆分为3个表达式,用
??
分隔:

Company?.Call?.SingleOrDefault(cf => cf.Name == Client?.CallID)
??
Company?.Call?.SingleOrDefault(cf=>cf.IsDefault)
??
new CallData();
整个表达式的返回值将是第一个返回非null值的表达式

在每个段中,一旦使用
?。
访问的任何属性为
null
,整个表达式将被计算为
null


请参见该
?。
运算符被称为空条件运算符,是C#6的一项新功能,于2014年10月发布

第一部分:
Company?.Call?.SingleOrDefault
与此类似:

if (Company == null)
{
    return null;
}
else if (Company.Call == null)
{
    return null;
}
else
{
    return Company.Call.SingleOrDefault(....
}
但是,最初的编码器使用了
空合并运算符,它至少从2007年起就成为C#的一部分。这意味着,若
??
的左边是
null
,则计算
??
右边的内容,并返回该值

因此,代码基本上意味着:

  • 如果
    Company
    null
    ,则返回
    newcalldata()
  • 如果
    Company.Call
    null
    ,则返回
    new CallData()
  • 如果对
    Company.call.SingleOrDefault
    的第一次调用返回一个
    CallData
    实例(具有
    Name
    属性的特定值),则返回该实例
  • 如果第一个调用返回
    null
    ,但第二个调用返回
    CallData
    实例(默认实例),则返回该实例
  • 如果对
    SingleOrDefault
    的两个调用都返回
    null
    ,则返回
    newcalldata()
这段代码有一些问题

首先,它是不可读的,应该被重构成更容易理解的东西。新的语言特性很好,但只有在负责任地使用时才有用


第二:如果有多个
CallData
实例具有相同的
名称
,则
SingleOrDefault
将引发异常,但数据库中可能有一个唯一的索引来防止这种情况。
IsDefault
属性也是如此-如果有多条记录具有
IsDefault=true
SingleOrDefault
调用将引发异常。

有些人喜欢看世界燃烧……如果
Client
为null且
Company,则可能返回无效结果。使用name
null
exist调用
,这是应用每个ReSharper建议时得到的结果。写起来很有趣,但不可读。有时代码需要明确。这里有五条业务规则,它们应该附有注释,指向或解释规范。几个
if()
语句不会伤害任何人。等等,SingleOrDefault可能会返回默认值,如果没有单个或默认值,为什么第二个语句(在第一个语句之后)会尝试返回默认值?它不是在第二次检查默认值(无用代码)吗?
SingleOrDefault
方法的名称与
IsDefault
属性的名称无关。
if (Company == null)
{
    return null;
}
else if (Company.Call == null)
{
    return null;
}
else
{
    return Company.Call.SingleOrDefault(....
}