2013-07-18 2 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"); 

Edit: Если вы хотите повторно использовать эту логику, попробуйте этот метод расширения:

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

Я не говорил, что это не так, просто заявив, что оператор с нулевым коалесцентом больше удобочитаемый. – 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 "]. Equals (" advanced ")' –

+0

@SimonBelanger хорошо понимает доступ к словарю, случай я бы использовал ваши ?? метод тоже :) – EkoostikMartin

0

, что об этом

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

Ищете один вкладыш, так как эта проблема - обычное явление –

Смежные вопросы