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

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

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

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

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

【问题讨论】:

  • 您在“?”之前缺少右括号。
  • @Corak 是的,错过了最后一个括号...现在编辑

标签: c# if-statement inline short-circuiting


【解决方案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/谓词中,强制使用 {} 以及显式返回可能同样不可读。
          猜你喜欢
          • 2016-03-26
          • 2021-08-20
          • 2017-08-23
          • 2017-10-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-18
          • 2011-06-30
          相关资源
          最近更新 更多