我意识到这就像Hello World级别的问题,但我不得不问。这两个条件可以简化为一个if
形态吗?
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
答案 0 :(得分:2)
如果您按步骤简化逻辑,则更容易遵循逻辑...
首先,您可以按如下方式缩短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
这使得阅读和理解变得有点困难,所以让我们进一步简化它。假设我们有“如果请求[”foo“]未设置为”执行某些操作的规则“(这基本上就是您原来的逻辑所做的那样),那么我们可以这样做:
if (Request["foo"] == null || Request["foo"].ToLower() != "on"))
// do stuff
答案 1 :(得分:1)
你做!isChecked,这与你测试的不同。试试这个:
if(Request["foo"] != null && !(Request["foo"].ToLower() == "on"))
答案 2 :(得分:1)
您正在检查!isChecked
,因此您的代码应为此
if (!((Request["foo"] != null) && (Request["foo"].ToLower() == "on")))
{
// Do Stuff
}
通过反转所有检查和&&
if ((Request["foo"] == null) || (Request["foo"].ToLower() != "on"))
{
// Do Stuff
}
答案 3 :(得分:1)
您可以将两个测试合并到:
bool isChecked = Request["foo"] != null && Request["foo"].ToLower() == "on";
您也可以在if
语句的谓词中使用它们。您可以这样做的原因是在C#中&&
和||
运算符“短路”。这意味着如果可以从左侧确定整个表达式的值,则不评估右侧。这很重要,因为在Request["foo"]
为null
的情况下,如果评估了右侧,则会得到空引用异常。在&&
或||
左侧测试null是所有C语言中非常常见的习惯用法。