5

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

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

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

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

4

6 回答 6

13

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

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

应该:

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

an 的 RHS||仅在左手为false时执行。您希望它仅在MyObject为空时执行。

编辑:如果你真的想要这个MyObject != null部分,你可以将整个事情更改为:

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

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

于 2013-03-01T11:58:56.623 回答
3

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

var test = (MyObject == null || string.IsNullOrEmpty(MyObject.Property) ? string.Empty : MyObject.Property
于 2013-03-01T11:59:47.920 回答
2

试试这个:

var test = (MyObject == null || string.IsNullOrEmpty(MyObject.Property)
             ? string.Empty : MyObject.Property
于 2013-03-01T11:59:54.230 回答
2
MyObject != null || string.IsNullOrEmpty(MyObject.Property) 

你在这里说。

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

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

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

这不会抛出空异常

于 2013-03-01T12:00:08.430 回答
2

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

MyObject != null && string.IsNullOrEmpty(MyObject.Property)
于 2013-03-01T12:00:10.673 回答
1

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

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

(您的例外原因已经在其他答案中解释过)

于 2013-03-01T12:08:17.110 回答