C# 避免Request.QueryString中的NullReferenceException

C# 避免Request.QueryString中的NullReferenceException,c#,asp.net,query-string,nullreferenceexception,C#,Asp.net,Query String,Nullreferenceexception,如果页面查询字符串中未指定模式,此代码将抛出NullReferenceException: bool isAdvancedMode = Request.QueryString["mode"].Equals("advanced"); 我就是这样解决这个问题的: bool isAdvancedMode = (Request.QueryString["mode"] + "").Equals("advanced"); 这是标准做法还是黑客行为?您可以使用: 编辑:如果要重新使用此逻辑,请尝试以下扩展

如果页面查询字符串中未指定
模式
,此代码将抛出
NullReferenceException

bool isAdvancedMode = Request.QueryString["mode"].Equals("advanced");
我就是这样解决这个问题的:

bool isAdvancedMode = (Request.QueryString["mode"] + "").Equals("advanced");
这是标准做法还是黑客行为?

您可以使用:

编辑:如果要重新使用此逻辑,请尝试以下扩展方法:

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

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

添加更多覆盖以匹配
等于
签名。我不确定这是否是一个好名字(我认为不是)。

为什么不使用空合并操作符

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

好吧,我建议你这样做:

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

事实上,这就是(接近底部,但这是一个很好的阅读,所以我读了所有)。您的做法是很好的,但这一点更为明确。

不同的方法,虽然代码多一点,但我认为其意图更为明确

bool isAdvancedMode = String.IsNullOrWhitespace(Request.QueryString["mode"]) ? 
                        false : Request.QueryString["mode"].Equals("advanced")
这个怎么样

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

美好的我们看看他选哪一个!啊哈。上次@newStackExchangeInstance和我(大约30分钟前)在30秒前回答了同样的问题,我赢了。我觉得这个应该给他。所以对他来说是+1谢谢你的回答,我想这是西蒙第一个回答的问题!实际上,它编译成相同的代码。不相信我?我并不是说它不存在,只是说空合并运算符更具可读性。我知道,只是当时的一个有趣事实:)寻找一个单行程序,因为这个问题很常见,仅供参考!虽然这很好,但对我来说,两次访问字典值(即使在大多数情况下是O(1))感觉很脏。此外,它还可以简化为
!String.IsNullOrWhitespace(Request.QueryString[“mode”])和&Request.QueryString[“mode”].Equals(“高级”)
@SimonBelanger关于字典访问的好观点,在这种情况下,我会使用您的??我自己也是:)
bool isAdvancedMode=(Request.QueryString["mode"] ?? string.Empty).Equals("advanced");