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