2013-07-18 73 views
4

此代碼拋出一個NullReferenceException如果mode在頁面查詢字符串中未指定:避免的NullReferenceException中的Request.QueryString

bool isAdvancedMode = Request.QueryString["mode"].Equals("advanced"); 

這是我如何解決此問題:

bool isAdvancedMode = (Request.QueryString["mode"] + "").Equals("advanced"); 

這是標準練習還是黑客?

回答

7

可以使用null-coalescing operator

bool isAdvancedMode = (Request.QueryString["mode"] ?? String.Empty).Equals("advanced"); 

編輯:如果你想重新使用這個邏輯,試試這個擴展方法:

public static bool EqualIfExists(this string source, string comparison) 
{ 
    return source != null && source.Equals(comparison); 
} 

Request.QueryString["mode"].EqualIfExists("advanced") 

添加更多的覆蓋,以匹配Equals簽名。我不確定這是否是一個好名字(我認爲不是)。

+0

尼斯。我們會看看他挑選哪一個! – AndrewK

+0

啊哈。上次@newStackExchangeInstance和我(如30分鐘前)相隔30秒回答相同的問題,我贏了。我覺得這個人應該去找他。所以給他+1。 ;) –

+0

感謝您的回答,認爲這是西蒙首先回答的問題! –

2

爲什麼不使用空合併運算符?

bool isAdvancedMode = (Request.QueryString["mode"] ?? String.Empty).Equals("advanced"); 
+0

實際上,它編譯爲相同的代碼。不要相信我? http://ericlippert.com/2013/06/17/string-concatenation-behind-the-scenes-part-one/ –

+0

我並不是說它沒有,只是指出null-coalescing運算符更多可讀。 – AndrewK

+0

我知道,只是有趣的一天:) –

4

嗯,我反而建議是:

bool isAdvancedMode = (Request.QueryString["mode"] ?? "").Equals("advanced"); 

其實,這就是your code compiles to(靠近底部,但它是一個良好的閱讀,所以我讀到這一切)。你的做法很好,但這更清楚一點。

+0

感謝您的參考! –

0

不同的方法,雖然更多的代碼,我認爲是更明確的意圖。

bool isAdvancedMode = String.IsNullOrWhitespace(Request.QueryString["mode"]) ? 
         false : Request.QueryString["mode"].Equals("advanced") 
+0

雖然這很好,但我感到骯髒的是兩次訪問字典值(儘管在大多數情況下它是_O(1)_)。此外,它可以被縮減爲'!String.IsNullOrWhitespace(Request.QueryString [「mode」])&& Request.QueryString [「mode」]。等於(「高級」)' –

+0

@SimonBelanger關於字典訪問的好處,我會用你的?方法我自己也:) – EkoostikMartin

0

這個怎麼

bool isAdvancedMode=(Request.QueryString["mode"] ?? string.Empty).Equals("advanced"); 
+0

尋找一個班輪真的,因爲這個問題是一個普遍的發生 –