【问题标题】:This is useful but I'm not sure why it works这很有用,但我不确定它为什么有效
【发布时间】:2010-12-13 00:09:58
【问题描述】:
protected override Boolean IsValid(String propertyValue)
{
    return !String.IsNullOrEmpty(propertyValue) && propertyValue.Trim().Length > 0;
}

这种 C# 验证方法完全符合我的要求,但我不知道您可以像这样使用表达式短路。

当 propertyValue 为 null 时,执行是否仍需要计算表达式的第二部分以产生布尔结果,如果是这样,为什么第二部分不为 Trim 抛出 null ref 异常().Length > 0 调用?

我假设第二部分评估为 false 或 null,但我很想知道这里发生了什么。

抱歉,如果我遗漏了一些非常明显的东西,请赐教。

上帝 - 我错过了一些明显的东西,真是个白痴! - 当第一部分是错误的时,第二部分是无关紧要的,我什至知道这是短循环 - 抱歉浪费人家时间,尴尬的表情是什么?

添加了另一个标签以反映我在思考之前打字的尴尬。

【问题讨论】:

    标签: c# syntax expression short-circuiting


    【解决方案1】:

    这就是短路的作用。当你有

    e1 && e2
    

    并且 e1 计算结果为 false,e2 根本不计算。

    (对于

    e1 || e2
    

    如果 e1 为 true,则根本不计算 e2。)

    在 e2 具有“影响”(执行 I/O、引发异常等)的情况下,理解这一点很重要,因为短路会产生与完全评估不同的程序语义。

    【讨论】:

    • 这在 Turbo Pascal 时代曾经被称为 完全布尔进化,无论您是否仍想评估所有条件,它都是可配置的。
    • 相反,您可以使用单个 & 来执行按位与,这会强制计算双方。
    【解决方案2】:

    为了使连词为真,它的两个组成部分都必须为真。由于这个定义,而且因为 C# 先计算左连接,如果左连接计算为假,那么答案已经是假,C# 不需要计算右连接。

    【讨论】:

      【解决方案3】:

      这是因为 && 运算符

      条件与运算符 (&&) 对其布尔操作数执行逻辑与,但仅在必要时计算其第二个操作数。

      来自MSDN

      这是一个值得了解的好功能:)

      如果你有

      A AND B
      

      如果 A 为假,A 和 B 的计算结果总是为假,所以 B 是什么并不重要。

      【讨论】:

        【解决方案4】:

        这就是短路的意思。当第一个操作数为 false 时,不需要计算第二部分,因为无论如何结果都会为 false。

        【讨论】:

          【解决方案5】:

          有一个加号 (&&)。因此,当第一部分为假时,不需要评估第二部分。

          这比旧的 VB 6 天要好得多,当时该语句会导致空引用异常。

          【讨论】:

            猜你喜欢
            • 2012-07-21
            • 1970-01-01
            • 2015-09-06
            • 1970-01-01
            • 1970-01-01
            • 2015-05-05
            • 2017-07-24
            • 2023-04-01
            • 1970-01-01
            相关资源
            最近更新 更多