protected override Boolean IsValid(String propertyValue)
{
return !String.IsNullOrEmpty(propertyValue) && propertyValue.Trim().Length > 0;
}
这个C#验证方法正是我想要的,但我不知道你可以像这样使用表达式短路。
当propertyValue为null时,不执行仍然需要计算表达式的第二部分以产生布尔结果,如果是,为什么第二部分为什么不为修剪抛出空引用异常().Length> 0 致电?
我假设第二部分正在评估为false或为null,但我很想知道这里发生了什么。
道歉,如果我遗漏了一些非常明显的东西,请赐教。
上帝 - 我错过了一些显而易见的白痴! - 当第一部分是假的时候,第二部分是无关紧要的,我甚至知道这是短暂的 - 对不起为了浪费人们的时间,尴尬的表情是什么?
添加了另一个标签,以反映我在思考之前打字时的尴尬。
答案 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天要好得多,因为该语句会导致空引用异常。