这很有用,但我不确定它为什么会起作用

时间:2009-11-04 12:21:34

标签: c# syntax expression short-circuiting

protected override Boolean IsValid(String propertyValue)
{
    return !String.IsNullOrEmpty(propertyValue) && propertyValue.Trim().Length > 0;
}

这个C#验证方法正是我想要的,但我不知道你可以像这样使用表达式短路。

当propertyValue为null时,不执行仍然需要计算表达式的第二部分以产生布尔结果,如果是,为什么第二部分为什么不为修剪抛出空引用异常().Length> 0 致电?

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

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

上帝 - 我错过了一些显而易见的白痴! - 当第一部分是假的时候,第二部分是无关紧要的,我甚至知道这是短暂的 - 对不起为了浪费人们的时间,尴尬的表情是什么?

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

5 个答案:

答案 0 :(得分:17)

这就是短路的原因。当你有

e1 && e2

和e1的计算结果为false,e2根本没有评估。

(并且

e1 || e2

如果e1 true ,则根本不评估e2。)

在e2具有“效果”(I / O,引发异常,......)的情况下,这很重要,因为短路会产生与完全评估不同的程序语义。

答案 1 :(得分:2)

为了使连接成立,它的两个组件都必须为真。由于这个定义,并且因为C#首先评估左联合,如果左联合评估为假,则答案已经为假,并且C#不需要评估正确的合取。

答案 2 :(得分:2)

这是因为&&操作

  

条件AND运算符(&&)执行其bool操作数的逻辑AND,但只在必要时才计算其第二个操作数。

来自MSDN

了解一个很好的功能:)

如果你有

A AND B

如果A为假,A和B将总是评估为假,所以B并不重要。

答案 3 :(得分:2)

这就是短路的意思。当第一个操作数产生false时,不需要计算第二个部分,因为结果将是false。

答案 4 :(得分:0)

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

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