c# - 表达式的正确评估

标签 c# expression

我在别人的代码中遇到了以下表达式。我认为这是糟糕的代码,原因有很多(尤其是因为它没有考虑 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/

相关文章:

时间:2019-03-17 标签:c#classgraphtoNeo4j

c# - 在 linqQuery 中只返回部分字符串

javascript - return 语句在 setter 中做什么?

c# - 错误 : the accessibility modifier of the set accessor must be more restrictive than the property or indexer

c# - 如何在 MVC Razor 的 HTML.TextAreaFor 文本中显示链接?

c# - 将表达式 <Func<Foo, bool>> 转换为另一个表达式 <Func<Bar, bool>> 的正确方法

matlab - Eigen C++ 中数学表达式的内联计算

java - 错误:illegal start of expression and “;” expected

c# - File.ReadLines() 行中的读取是否有最大值?

Python- 正则表达式输出最后一次出现 [HTML Scraping]