if (Request.QueryString["UseGroups"] != null)
{
if (Request.QueryString["UseGroups"] == "True")
{
report.IncludeGroupFiltering = true;
}
else
{
report.IncludeGroupFiltering = false;
}
}
else
{
report.IncludeGroupFiltering = false;
}
答案 0 :(得分:47)
只需一张支票:
report.IncludeGroupFiltering = Request.QueryString["UseGroups"] == "True";
没有必要对Request.QueryString["UseGroups"]
进行两次评估 - 如果它是非空的,它只能等于“True”,如果是>,那么比较将完美地运行(并返回false) em> null。
任何仍在进行两项操作的解决方案都会使问题过于复杂:)
答案 1 :(得分:21)
report.IncludeGroupFiltering = Request.QueryString["UseGroups"] == "True"
答案 2 :(得分:14)
report.IncludeGroupFiltering = Request.QueryString["UseGroups"] == "True";
答案 3 :(得分:3)
我认为Request.QueryString["UseGroups"] == "True"
和“True”只是一个字符串,它的行为不像bool。
所以,
你可以写一行
report.IncludeGroupFiltering = string.IsNullOrEmpty(Request.QueryString["UseGroups"])?
false : (Request.QueryString["UseGroups"] == "True");
答案 4 :(得分:2)
report.IncludeGroupFiltering = "True" == Request.QueryString["UseGroups"];
答案 5 :(得分:1)
将Request.QueryString [“UseGroups”]部分分解为明确表示你要引用相同的东西,然后变为:
string useGroups = Request.QueryString["UseGroups"];
report.IncludeGroupFiltering = (useGroups != null) && (useGroups == "True");
答案 6 :(得分:0)
report.IncludeGroupFiltering = (Request.QueryString["UseGroups"] != null)
&& (Request.QueryString["UseGroups"] == "True");
答案 7 :(得分:0)
你基本上就是这样做的。只需删除冗余的内部其他内容:
if(Request.QueryString["USeGroups"] != null)
{
if(Request.QueryString["UseGroups"] == "True")
report.IncludeGroupFiltering = true;
}
else report.IncludeGroupFiltering = false;
答案 8 :(得分:0)
也许这个:
report.IncludeGroupFiltering = false;
if (Request.QueryString["UseGroups"] == "True")
report.IncludeGroupFiltering = true;
答案 9 :(得分:0)
使用TryParse怎么样:
bool includeGroupFiltering;
bool throwaway = Boolean.TryParse(Request.QueryString["UseGroups"], out includeGroupFiltering);
report.IncludeGroupFiltering = includeGroupFiltering;
答案 10 :(得分:0)
这就是我这样做的代码:
report.IncludeGroupFiltering = false;
if (Request.QueryString["UseGroups"] != null &&
Request.QueryString["UseGroups"] == "True" //note that I am not a C# expert - this line /may/ throw an exception if it is indeed null.
{
report.IncludeGroupFiltering = true;
}
答案 11 :(得分:0)
report.IncludeGroupFiltering = ShouldIncludeGroupFiltering(Request.QueryString["UseGroups"])
private boolean ShouldIncludeGroupFiltering(String queryString) {
return ("True" == queryString)
}
答案 12 :(得分:-1)
字符串常量是不可变的和雾化的,它们也是引用对象。但是,Request.QueryString [“UserGroups”]的结果是一个字符串引用(或对可能隐式转换为字符串的对象的引用...)可能没有被雾化,所以你不能只是比较可能的引用即使字符串相等也是不同的。
字符串对上的==运算符不是比较引用而是比较字符串内容。这意味着将取消引用Request.QueryString [“UserGroups”],这可能会导致空指针解除引用异常。这就是为什么有一个null的先前测试(因为带有“reference == null”的测试不是取消引用引用,而是实际检查它是否为null)。
然而,有可能避免空检查:如果Request.QueryString [“Usergroups”]的结果已被雾化,您可以使用===运算符来比较引用(但它可能需要分配和散列在静态的原子列表中,如果QueryString非常大,不是一个好主意。
所以是的,最好的办法是首先在本地字符串变量中缓存Querystring,然后执行两个测试:
final string queryString; // cache the string value
if ((queryString = Request.QueryString["UserGroups"]) != null &&
queryString == "True") {
...
} else {
...
}
但是假设你的if / else语句的主体只是存储if()条件的结果,那就写下来:
final string queryString; // temporary register caching the non-atomized string reference
report.IncludeGroupFiltering =
(queryString = Request.QueryString["UserGroups"]) != null &&
queryString == "True"; // compares the two strings contents
但是,如果Request.QueryString []内容已经是雾化字符串,或者如果它们隐式转换为字符串返回雾化字符串,则保存字符串比较并使用===代替:
final string queryString; // temporary register caching the atomized string reference
report.IncludeGroupFiltering =
(queryString = Request.QueryString["UserGroups"]) != null &&
queryString === "True"; // compares the atomized references
我不会在这里建议这个危险的假设(出于安全/内存的原因,更有可能来自远程源的查询结果不会被雾化,除非已经检查了返回的值。鉴于你的代码,我怀疑这个正在对查询返回的值执行验证,因此结果很可能不会被雾化:代码的主要原因是将查询字符串的内容原子化为共享的布尔值,稍后将更容易比较。
注意:我绝对不知道Request.QueryString [“UserGroups”]返回的值或引用的类型是什么。可能会发生这是一个实现“bool operator ==(string)”方法的对象,或者甚至返回另一个类型而不是bool。如果对象的类型不为null,则将返回的对象存储在字符串变量中将执行其转换为字符串(如果对象是兼容的,否则您将获得异常)。
如果对象本身可以与“True”之类的字符串进行比较,您可能希望避免对未知对象进行此转换,代码如下:
report.IncludeGroupFiltering =
Request.QueryString["UserGroups"] != null &&
// uses object's operator==(string) to compare its contents OR reference.
Request.QueryString["UserGroups"] == "True";
所有这些取决于您如何声明Request对象的QueryString []数组属性,以及数组内容是否可以是多态的(变化类型)。如果您知道它是如何声明的,那么使用完全相同的类型来声明上面的临时final寄存器,以避免从Request获取对QueryString的双成员访问,以及对QueryString数组进行双重索引。
在这里,我们不可能知道哪个代码对你最好,因为我们没有所有的声明(C#继承了与C ++相同的类型复杂性/歧义,有太多的隐式转换和复杂的继承方案)。 / p>