我在别人的代码中遇到了以下表达式。我认为这是糟糕的代码,原因有很多(尤其是因为它没有考虑 bool.TrueString 和 bool.FalseString),但我很好奇编译器将如何评估它。
private bool GetBoolValue(string value)
{
return value != null ? value.ToUpper() == "ON" ? true : false : false;
}
编辑 顺便说一句,表达式不是从内到外计算的吗?在这种情况下,在调用将抛出空引用异常的 value.ToUpper() 之后检查 value != null 有什么意义?
我认为以下是正确的(故意)冗长的版本(我永远不会这样离开它 :D ):
if (value != null)
{
if (value.ToUpper() == "ON")
{
return true;
}
else // this else is actually pointless
{
return false;
}
}
else
{
return false;
}
可以缩短为:
return value != null && value.ToUpper == "ON";
这是对表达式的正确重写吗?
最佳答案
看起来该方法旨在处理来自 checkbox
HTML 元素的值。如果没有为复选框指定值,则默认使用值 "on"
。如果未选中该复选框,则表单数据中根本没有任何值,因此从 Request.Form
读取键会给出空引用。
在这种情况下,该方法是正确的,尽管由于使用了 if-condition-then-true-else-false
反模式,它非常可怕。此外,它应该被赋予一个更适合其特定用途的名称,例如 GetCheckboxValue
。
您对方法的重写是正确且合理的。由于值不依赖于文化,因此将值转换为大写不应使用当前文化。因此,比您提议的重写稍微好一点的重写是:
return value != null && value.ToUpperInvariant == "ON";
(独立于文化的方法也比使用特定文化的方法快一点,所以没有理由不使用它们。)
Incidentally, aren't the expressions evaluated from the inside-outwards?
如果是方法调用,那么所有表达式都会被实际计算,因为必须进行内部调用来计算外部调用的参数。
但是,条件表达式的第二个和第三个操作数只有在使用时才会被求值,所以表达式是从外向内求值的。首先评估最外层的条件,以确定它将评估哪个操作数。
关于c# - 表达式的正确评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/768338/