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

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

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

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

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

上帝 - 我错过了一些明显的白痴!- 当第一部分是假的时,第二部分是无关紧要的,我什至知道这是短循环的事实完全空白 - 很抱歉浪费人们的时间,尴尬的表情是什么?

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

4

5 回答 5

17

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

e1 && e2

e1 评估为假, e2 根本不评估。

(并且对于

e1 || e2

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

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

于 2009-11-04T12:24:03.367 回答
2

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

于 2009-11-04T12:24:58.773 回答
2

这是因为 && 运算符

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

来自MSDN

是一个很好的功能了解:)

如果你有

A AND B

如果 A 为假,A 和 B 将始终评估为假,所以 B 是什么并不重要。

于 2009-11-04T12:25:18.043 回答
2

这就是短路的意思。当第一个操作数产生假时,不需要评估第二部分,因为结果无论如何都是假的。

于 2009-11-04T12:25:43.733 回答
0

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

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

于 2009-11-04T12:27:15.773 回答