我在代码中跳入了这样的话题,我真的不知道该怎么读。如果有人可以帮助我,那会很好:)
return Company?.Call?.SingleOrDefault(cf => cf.Name == Client?.CallID)
?? Company?.Call?.SingleOrDefault(cf => cf.IsDefault)
?? new CallData();
最佳答案
?.
运算符称为空条件运算符,是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(....
}
但是随后原始编码器使用了
??
Null-coalesce运算符,该运算符至少从2007年开始就已成为C#的一部分。这意味着,如果??
剩下的是null
,请评估哪个正确。 ??
并返回它。因此,代码基本上意味着:
如果
Company
是null
,则返回new CallData()
如果
Company.Call
是null
,则返回new CallData()
如果第一次调用
Company.Call.SingleOrDefault
返回一个CallData
实例(Name
属性具有某个值),则返回该实例如果第一个调用返回
null
,但是第二个调用返回一个CallData
实例(默认),则返回该实例如果两个对
SingleOrDefault
的调用均返回null
,则返回new CallData()
这段代码有一些问题。
首先,它是不可读的,应该重构为更容易理解的东西。新的语言功能很好,但只有在负责任地使用时才能使用。
第二:如果有多个
CallData
实例具有相同的Name
,则SingleOrDefault
将引发异常,但是数据库中可能存在唯一索引,因此可以防止这种情况。 IsDefault
属性也是如此-如果IsDefault = true
有多个记录,则SingleOrDefault
调用将引发异常。