内联if语句-短路求值

5

据我理解和阅读,您可以在if语句中使用短路(&&或||),以便第二个条件不会触发。如果您想要同时满足两个条件,您应该使用单个操作符(&或|)。

所以,假设我有以下内联if语句:

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

如果MyObject为空,这将抛出“对象引用”错误,在我看来不应该发生,因为我正在使用短路。能否有人解释一下。

3
在问号前面缺少一个右括号。 - Corak
@Corak 是的,我错过了最后一个括号...已经修改了。 - Zaki
6个回答

13

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

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

应该是:

MyObject == null || string.IsNullOrEmpty(MyObject.Property)
< p > || 的右侧只有在左侧为 false 时才会执行。您希望它只在 MyObject 不为 null 时执行。

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

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

请注意,条件运算符的第二个和第三个操作数也要颠倒。

啊,我明白了。如果我在相同的条件下使用&&而不是||,那应该没问题。 - Zaki
@Sam1:嗯,你还需要翻转它的其他位。 - Jon Skeet

3

你应该使用“==”而不是“!=”

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

2

试试这个:

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

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

在这里,你说。

如果我的对象不是 null。 或者 string.IsNullOrEmpty(MyObject.Property)

这意味着如果 MyObject 是 null,它将尝试执行第二部分。

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

这不会抛出空指针异常


2

这是因为MyObject为空(null),所以第一个条件为假(false),必须评估第二个条件才能知道整个条件语句的结果。将此行更改为以下内容:

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

1

你应该更注重可读性而不是代码行数,例如:

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

你的异常原因已经在其他答案中解释过了。


代码行数并不总是目标。例如,在Lambda / predicate中,强制使用{}以及显式返回可能会导致代码难以阅读。 - JoeBrockhaus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接