繁体   English   中英

在一个IF语句中测试两个条件

[英]Testing for two conditions in one IF statement

我意识到这就像“ Hello World”问题一样,但是我不得不问。 可在这两种状态可以简化成一个if statament?

bool isChecked = false;

if(Request["foo"] != null) // Check box
      isChecked = (Request["foo"].ToLower() == "on");

if (!isChecked)
      // do stuff

单独地,我在这两种情况下都是正确的,但是当我将它们添加到与&&联接的if语句中时,不会得到相同的结果。

if(Request["foo"] != null && (Request["foo"].ToLower() == "on"))
          // do stuff

如果逐步简化逻辑,则遵循逻辑会更容易...

首先,您可以缩短isChecked的分配,如下所示:

bool isChecked = Request["foo"] != null && Request["foo"].ToLower() == "on";

if (!isChecked)
      // do stuff

然后,我们只需要摆脱isChecked变量,可以通过一个简单的交换来完成:

if (!(Request["foo"] != null && Request["foo"].ToLower() == "on"))
      // do stuff

这使得阅读和理解起来有点困难,所以让我们进一步简化一下。 假设我们有“如果没有将Request [“ foo”]设置为on的话做某事”的规则(这基本上就是您原来的逻辑正在做的事情),那么我们可以这样做:

if (Request["foo"] == null || Request["foo"].ToLower() != "on"))
      // do stuff

您执行!isChecked,这与您的测试不同。 尝试这个:

 if(Request["foo"] != null && !(Request["foo"].ToLower() == "on"))

您正在检查的是!isChecked因此您的代码应为

        if (!((Request["foo"] != null) && (Request["foo"].ToLower() == "on")))
        {
            // Do Stuff
        }

可以通过反转所有支票和&&来分配和简化

        if ((Request["foo"] == null) || (Request["foo"].ToLower() != "on"))
        {
            // Do Stuff
        }

您可以将两个测试合并为:

bool isChecked = Request["foo"] != null && Request["foo"].ToLower() == "on";

您也可以将它们放在if语句的谓词中。 可以执行此操作的原因是在C#中, &&|| 操作员“短路”。 这意味着,如果可以从左侧确定整个表达式的值,则不会评估右侧。 这很重要,因为在Request["foo"]null的情况下,如果评估右侧,则会得到null引用异常。 测试&&||左侧的null 在所有C语言衍生语言中,这是一个非常常见的习惯用法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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