我在代码中跳入了这样的话题,我真的不知道该怎么读。如果有人可以帮助我,那会很好:)

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,请评估哪个正确。 ??并返回它。

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


如果Companynull,则返回new CallData()
如果Company.Callnull,则返回new CallData()
如果第一次调用Company.Call.SingleOrDefault返回一个CallData实例(Name属性具有某个值),则返回该实例
如果第一个调用返回null,但是第二个调用返回一个CallData实例(默认),则返回该实例
如果两个对SingleOrDefault的调用均返回null,则返回new CallData()


这段代码有一些问题。

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

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

09-07 01:01