[英]Can anyone think of an elegant way of reducing this nested if-else statement?
if (Request.QueryString["UseGroups"] != null)
{
if (Request.QueryString["UseGroups"] == "True")
{
report.IncludeGroupFiltering = true;
}
else
{
report.IncludeGroupFiltering = false;
}
}
else
{
report.IncludeGroupFiltering = false;
}
只需一次检查:
report.IncludeGroupFiltering = Request.QueryString["UseGroups"] == "True";
有没有必要评价Request.QueryString["UseGroups"]
两次-它只能是等于“真”,如果它非空,比较将会很好地工作(返回FALSE),如果它是空的 。
任何仍在执行两项操作的解决方案会使问题变得更加复杂:)
report.IncludeGroupFiltering = Request.QueryString["UseGroups"] == "True"
report.IncludeGroupFiltering = Request.QueryString["UseGroups"] == "True";
\n
我认为Request.QueryString["UseGroups"] == "True"
和“ True”仅是一个字符串,它的行为不像bool。 所以,你可以写一行
report.IncludeGroupFiltering = string.IsNullOrEmpty(Request.QueryString["UseGroups"])?
false : (Request.QueryString["UseGroups"] == "True");
report.IncludeGroupFiltering = "True" == Request.QueryString["UseGroups"];
分解出Request.QueryString [“ UseGroups”]部分,以使您清楚地要引用同一件事,然后它变成:
string useGroups = Request.QueryString["UseGroups"];
report.IncludeGroupFiltering = (useGroups != null) && (useGroups == "True");
report.IncludeGroupFiltering = (Request.QueryString["UseGroups"] != null)
&& (Request.QueryString["UseGroups"] == "True");
您基本上按照我的方式进行。 只需删除多余的内部else:
if(Request.QueryString["USeGroups"] != null)
{
if(Request.QueryString["UseGroups"] == "True")
report.IncludeGroupFiltering = true;
}
else report.IncludeGroupFiltering = false;
也许这样:
report.IncludeGroupFiltering = false;
if (Request.QueryString["UseGroups"] == "True")
report.IncludeGroupFiltering = true;
关于使用TryParse呢?
bool includeGroupFiltering;
bool throwaway = Boolean.TryParse(Request.QueryString["UseGroups"], out includeGroupFiltering);
report.IncludeGroupFiltering = includeGroupFiltering;
这就是我执行此类代码的方式:
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;
}
report.IncludeGroupFiltering = ShouldIncludeGroupFiltering(Request.QueryString["UseGroups"])
private boolean ShouldIncludeGroupFiltering(String queryString) {
return ("True" == queryString)
}
字符串常量是不可变的且是原子化的,它们也是引用对象。 但是,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”]返回的值或引用的类型是什么。 这可能是实现“布尔运算符==(字符串)”方法的对象,甚至可能返回布尔类型以外的其他类型。 但是,如果对象的类型不为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 []数组属性,以及数组内容是否可以是多态的(可变类型)。 如果知道如何声明,请使用完全相同的类型声明上面的临时最终寄存器,以避免从Request对QueryString的双成员访问以及QueryString数组的双索引。
在这里,不可能知道哪个代码最适合您,因为我们没有所有的声明(C#继承了与C ++相同的类型复杂性/歧义性,具有太多的隐式转换和复杂的继承方案)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.