内联 If 语句 - 短路

Posted

技术标签:

【中文标题】内联 If 语句 - 短路【英文标题】:Inline If statement - short-circuiting 【发布时间】:2013-02-15 22:10:04 【问题描述】:

据我了解和阅读,您可以在 if 语句(&& 或 ||)中使用短路,以便不触发第二个条件。如果您希望这两个条件都触发,您将使用单个操作数(& 或 |)。

所以说如果我有如下的内联 if 语句:

var test = (MyObject != null || string.IsNullOrEmpty(MyObject.Property)) ? string.Empty : MyObject.Property;

如果 MyObject 为空,这将引发 object reference 错误,我认为这不应该,因为我正在使用短路。有人可以解释一下吗?

【问题讨论】:

您在“?”之前缺少右括号。 @Corak 是的,错过了最后一个括号...现在编辑 【参考方案1】:

您使用了错误的条件。这部分:

MyObject != null || string.IsNullOrEmpty(MyObject.Property)

应该是:

MyObject == null || string.IsNullOrEmpty(MyObject.Property)

|| 的 RHS 仅在左手为 false 时执行。您希望它仅在 MyObjectnot null 时执行。

编辑:如果您真的想要 MyObject != null 部分,您可以将整个内容更改为:

var test = MyObject != null && !string.IsNullOrEmpty(MyObject.Property)
       ? MyObject.Property : "";

请注意条件运算符的第二个和第三个操作数的反转。

【讨论】:

啊,我明白了,如果我在相同条件下使用 && 而不是 ||应该没问题 @Sam1:你还需要反转它的其他部分。【参考方案2】:

你应该有一个 == 而不是一个 !=

var test = (MyObject == null || string.IsNullOrEmpty(MyObject.Property) ? string.Empty : MyObject.Property

【讨论】:

【参考方案3】:

试试这个:

var test = (MyObject == null || string.IsNullOrEmpty(MyObject.Property)
             ? string.Empty : MyObject.Property

【讨论】:

【参考方案4】:
MyObject != null || string.IsNullOrEmpty(MyObject.Property) 

你说。

如果我的对象不为空。 要么 string.IsNullOrEmpty(MyObject.Property)

这意味着如果 MyObject 为空,他将尝试执行第二部分。

MyObject == null || string.IsNullOrEmpty(MyObject.Property)

这不会抛出空异常

【讨论】:

【参考方案5】:

发生这种情况是因为MyObjectnull,因此第一个条件是false,因此必须评估第二部分以了解整个条件。将行更改为:

MyObject != null && string.IsNullOrEmpty(MyObject.Property)

【讨论】:

【参考方案6】:

你应该更喜欢可读性而不是行数,例如:

string prop = string.Empty;
if(MyObject != null && MyObject.Property != null)
    prop = MyObject.Property;

(您的异常原因已在其他答案中解释过)

【讨论】:

行数并不总是目标。例如,在 Lamda/谓词中,强制使用 以及显式返回可能同样不可读。

以上是关于内联 If 语句 - 短路的主要内容,如果未能解决你的问题,请参考以下文章

刀片内联 if 和 else if 语句

内联中的多个语句 if

html 内联IF语句Umbraco 7.html

python3中带有内联赋值的if语句(赋值表达式)

如何使用 ? : 带有 Razor 和内联代码块的 if 语句

是否可以在 HTML 中为刀片模板编写 IF 内联