2012-08-24 49 views
1

所以我有一個Retrieve()函數,要麼得到我一個對象或null(如果沒有找到該對象)。我正在使用帶有該對象的布爾屬性的if語句。它是這樣設置的。有沒有一種巧妙的方法來處理這個空對象引用?

if(Retrieve(index).IsForm == true) {} 

這個問題是,如果它沒有找到一個對象,它會拋出一個空引用異常。當然,有一些解決方法,但沒有一個我覺得簡潔。有一個嘗試...趕上,但是當我期望錯誤時,這似乎毫無意義。我可以檢查對象是否爲空,if(Retrieve(index) != null),但這似乎是添加不必要的嵌套。有一個聰明的方法來處理這個問題嗎?我想過使用空合併運算符,但在這種情況下它不起作用。

+0

我不認爲有任何更簡潔的方式來做到這一點,沒有。 – Chris

+1

簡潔並不總是最好的方法。可讀性通常要重要得多。 –

+0

根據您的情況,您可以使用空對象模式。看到這個問題http://stackoverflow.com/q/11972281/1066291。 –

回答

2

您可以調用兩次方法:

var result = Retrieve(index); 
if(result != null && result.IsForm == true) { } 
0

我不認爲有任何更多:

if(Retrieve(index) != null && Retrieve(index).IsForm == true) { } 

或者你也可以分開纔打破線和存儲結果,如果簡潔的方式來做到這一點,不。

我能想到的最短是:

if(Retrieve(index)!=null && Retrieve(index).IsForm == true) {} 

,但這是因爲它調用Retrieve(index)多次,我不喜歡。我會去的

var foo = Retrieve(index); 
if(foo!=null && foo.IsForm == true) {} 

但這顯然沒有做任何聰明或更簡潔。這可能比一些替代品更有效率。

1

空對象模式在這裏會有所幫助。它保持您的調用代碼清潔,但確實增加了一個額外的類。

class NullWhatever : Whatever 
{ 
    public NullWhatever() { IsForm = false; } 
} 


Whatever Retrieve(...) 
{ 
    ... 
    return new NullWhatever(); // instead of null 
} 
+0

Jinx。我只是在評論中說同樣的事情:) –

2

你可以寫一個IsForm函數來爲你做這兩個操作:

bool IsForm(int index) 
{ 
    var result = Retrieve(index); 
    return result != null && result.IsForm; 
} 

if (IsForm(index)) 
    ... 
0

你可以將兩個條件在同一if

if(Retrieve(index)!= null && Retrieve(index).IsForm == true) {} 

由於短路,如果空檢查失敗,則不計算表達式的其餘部分。

+0

調用檢索兩次?如果它很慢呢? –

+0

只是分成兩個語句:var whatever = Retrieve(index);如果(無論!= null &&無論。IsForm){}' –

1

您可以創建一個Nullable_IsForm擴展方法。然後你可以檢查null條件。

public static class RetrieveExtension 
{ 
    public static bool? Nullable_IsForm(this Retrieve retrieved) 
    { 
     if(retrieved == null) 
     { 
      return null; 
     } 
     else 
     { 
      return retrieved.IsForm; 
     } 
    } 
} 

然後在你的代碼,你會檢查它,bool

if(Retrieve(index).Nullable_IsForm == true) 
{} 
else if (Retrieve(index).Nullable_IsForm == false) 
{} 
else if (Retrieve(index).Nullable_IsForm == null) 
{} 
相關問題