如何阅读这种结构?(涉及IT技术)

3

我在代码中遇到了这样的问题,但我真的不知道如何解决。如果有人能帮助我,那就太好了 :)

return Company?.Call?.SingleOrDefault(cf => cf.Name == Client?.CallID) 
    ?? Company?.Call?.SingleOrDefault(cf => cf.IsDefault) 
    ?? new CallData();

7
有些人只是喜欢看世界燃烧... - Tamir Vered
如果Client为空且存在名称为nullCompany.Call,则可能返回无效结果。 - fubo
3
当你应用每一个ReSharper建议时,这就是你所得到的结果。写起来很有趣,但却难以阅读。有时候代码需要变得更加明确。这里有五个业务规则,应该附带一条注释来指向或解释规范。一些if()语句并不会对任何人造成伤害。 - CodeCaster
等等,SingleOrDefault 可能会返回默认值,为什么第二个语句(在第一个 ?? 之后)尝试返回默认值,如果既没有 Single 也没有 Default?它不是第二次检查默认值(无用代码)吗? - devRicher
SingleOrDefault 方法的名称与 IsDefault 属性的名称无关。 - Anders Marzi Tornblad
2个回答

3

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

Company?.Call?.SingleOrDefault(cf => cf.Name == Client?.CallID)
??
Company?.Call?.SingleOrDefault(cf=>cf.IsDefault)
??
new CallData();

整个表达式返回的值将是第一个返回非空值的表达式。

在每个段落内,一旦使用?.访问的任何属性为null,则整个表达式将被评估为null

请参阅Null-conditional Operators


3
?. 运算符被称为 Null-conditional 运算符,是C# 6的新特性,在2014年10月宣布推出。 https://msdn.microsoft.com/en-us/library/dn986595.aspx Company?.Call?.SingleOrDefault 的第一部分可以看作类似于以下代码:
if (Company == null)
{
    return null;
}
else if (Company.Call == null)
{
    return null;
}
else
{
    return Company.Call.SingleOrDefault(....
}

但是原来的编码人员使用了自从2007年就已经成为C#一部分的?? Null-coalesce运算符。它的意思是,如果??左边的任何东西都是null,则计算右边的内容并返回那个值。
所以这段代码基本上的意思是:
- 如果Company是null,则返回new CallData() - 如果Company.Call是null,则返回new CallData() - 如果对Company.Call.SingleOrDefault的第一个调用返回一个CallData实例(具有某个Name属性的特定值),则返回该实例 - 如果第一个调用返回null,但第二个调用返回一个CallData实例(即默认实例),则返回该实例 - 如果两个SingleOrDefault调用都返回null,则返回new CallData()
这段代码存在一些问题。
首先,它难以阅读,应该重构成更容易理解的内容。新的语言功能很好,但只有在负责任地使用时才能发挥作用。
其次:如果有多个具有相同名称的CallData实例,则SingleOrDefault将抛出异常,但数据库中可能有唯一索引可以防止这种情况发生。对于IsDefault属性也是如此 - 如果有多条记录具有IsDefault = true,则SingleOrDefault调用将抛出异常。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接