2017-04-09 89 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 
}