内联 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 时执行。您希望它仅在 MyObject
为 not 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】:发生这种情况是因为MyObject
是null
,因此第一个条件是false
,因此必须评估第二部分以了解整个条件。将行更改为:
MyObject != null && string.IsNullOrEmpty(MyObject.Property)
【讨论】:
【参考方案6】:你应该更喜欢可读性而不是行数,例如:
string prop = string.Empty;
if(MyObject != null && MyObject.Property != null)
prop = MyObject.Property;
(您的异常原因已在其他答案中解释过)
【讨论】:
行数并不总是目标。例如,在 Lamda/谓词中,强制使用
和
以及显式返回可能同样不可读。以上是关于内联 If 语句 - 短路的主要内容,如果未能解决你的问题,请参考以下文章