繁体   English   中英

谁能想到一种精巧的方法来减少此嵌套的if-else语句?

[英]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"

\n

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM