我经常发现自己编写类似的代码,如下例所示:
if (object["Object Name"] != null) {
if (object["Object Name"] == "Some Value") {
// Do Statement A
} else {
// Do Statement B
}
} else {
// Do Statement B
}
这里的问题是我要检查对象是否为空,然后我可以检查它的实际内容。
“语句B”始终相同,在我的情况下通常是SQL语句。
必须有更好的解决方法吗?
感谢
斯蒂芬
答案 0 :(得分:23)
C#中存在短路,因此您可以这样做:
if(null != object && object.name == foo)
do A
else
do B
C#始终首先计算条件语句中的第一个表达式,如果失败,则不会在语句的该部分中尝试任何其他表达式。
为了进一步说明这一点,如果您要在条件语句中进行昂贵的操作以及一个或多个廉价操作,最好尽可能将其放在最后,因此它只会检查昂贵的操作。真的需要。像
这样的东西if(trivial comparison && trivial comparison && REALLY EXPENSIVE OPERATION)
现在它只会作为最后的手段执行昂贵的操作。
答案 1 :(得分:1)
由于C#短路,是的。试试这个:
if (object["Object Name"] != null && object["Object Name"] == "Some Value")
{
// Do Statement A
}
else
{
// Do Statement B
}
答案 2 :(得分:1)
我认为重写if-then-else会使它看起来更好,因为单个B语句。
if ((object["Object Name"] != null) && (object["Object Name"] == "Some Value"))
{
// Do Statement A
}
else
{
// Do Statement B
}
答案 3 :(得分:1)
为什么要仔细检查?当然这就足够了:
if(object["Object Name"] == "Some Value") {
// Do statement A
} else {
// Do statement B
}
我看到你在使用null检查时会得到什么,但你提供的特定示例并不需要它。
编辑:现在,如果你已经写了这个:
if (object != null) {
if (object["Object Name"] == "Some Value") {
// Do Statement A
} else {
// Do Statement B
}
} else {
// Do Statement B
}
然后解决方案是:
if(object != null && object["Object Name"] == "Some Value") {
// Do Statement A
} else {
// Do Statement B
}
答案 4 :(得分:0)
免责声明:不做一般的短路方法。
好吧,您可以创建一个单独的函数来执行查找,尤其是在查询保持不变的情况下。所以像这样:(伪代码传入)
private bool IsNullCheck(string objectName)
{
if (object["Object Name"] != null)
return false;
else
// statement B
}
if (!IsNullCheck("Object Name") && if(object["Object name"] == "Value") {
// stuffs
}
else
{
// Do Statement B
}
等等。