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