2017-04-09 78 views
0

任何人都可以告诉我如何优化下面的代码。C#空值检查优化

if (report != null && 
    report.Breakdown != null && 
    report.Breakdown.ContainsKey(reportName.ToString()) && 
    report.Breakdown[reportName.ToString()].Result != null 
    ) 
+1

优化怎么样?性能?短?还有别的吗? – TheLethalCoder

+0

您使用的是哪个版本的C#? C#6的空条件运算符可以在这里帮助。 –

+0

在您的报告类型定义上创建一个IsNull()操作,该定义对报告执行所有空检查。然后你可以打电话给它。 –

回答

3

正如其他人所说,你可以使用?.运营商结合你的一些null检查。不过,如果你对性能优化后,你应该避免双重字典查找(ContainsKey和索引访问),去一个TryGetValue来代替:

MyType match = null; // adjust type 
if (report?.Breakdown?.TryGetValue(reportName.ToString(), out match) == true && 
    match?.Result != null) 
{ 
    // ... 
} 
+0

不要做“== true”;-) – Lucero

+0

@Lucero:你需要在这种情况下,因为结果是'bool?';否则,编译器会给出语法错误。 – Douglas

+0

@Douglas你可以使用null合并运算符'??',或者没问题。 – TheLethalCoder

0

您可以使用空条件操作,但仅在C#6

if (report?.Breakdown?.ContainsKey(reportName.ToString()) == true && 
    report.Breakdown[reportName.ToString()].Result != null) 
+0

发生编译时错误:Operator &&不能应用于bool和bool类型的操作数? –

+0

对不起,现在已经修复 –

0

艾曼的答案可能是你可以为C#6做到最好,对于在这之前你有什么有相当多的最好的如果所有这些对象都可以为空,你可以做。

进一步优化的唯一方法是在调用代码之前检查这些对象是否为null,或者更好地验证您的平台,以便这些特定函数不应该在第一时间被调用空值。

如果您只是从字典中获取值,但您也可以使用空合并操作符'??'来简化它,

例子:

MyDictionary['Key'] ?? "Default Value"; 

因此,如果在那项的值是零,你会得到默认的来代替。

因此,如果这仅仅是一个获取我只是去

var foo = 
    report != null && 
    report.Breakdown != null && 
    report.Breakdown.ContainsKey(reportName.ToString()) ? 
    report.Breakdown[reportName.ToString()].Result ?? "Default" : 
    "Default"; 

但如果你实际上在做的事情在循环,然后对,你说的,你可以到那里最好的漂亮多了。

0

对于C#6和更新,你可以这样来做:

if (report?.Breakdown?.ContainsKey(reportName.ToString()) == true && 
    report.Breakdown[reportName.ToString()].Result != null) 
0

你能在下面试试?也可能更好地运送到一个方法。

// unless report name is already a string 
string reportNameString = reportName.ToString(); 
if (report?.Breakdown?.ContainsKey(reportNameString) && 
    report.Breakdown[reportNameString].Result != null) 
{ 
    // rest of the code 
}