【问题标题】:Possible downside to immediate if operator (?:) in C#?C# 中的 if 运算符 (?:) 可能的缺点是什么?
【发布时间】:2009-02-05 12:09:26
【问题描述】:

我似乎记得在 C# 中避免使用立即 If 运算符 (?:),但我不知道我在哪里读到它以及它是什么。我认为这与在决定条件结果之前执行真假部分的事实有关。它是否正确?还是在 VB.Net 中是这样的?

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    它实际上称为条件运算符,在 MSDN 中称为“?:”。它基本上是if-else 的简写符号,除了这实际上是表达式,而不是语句。由于它等同于 if,因此该运算符没有任何警告。

    您所读到的可能是关于 VB.NET 中的Iif 函数。作为一个函数,它在被调用之前评估它的所有参数,所以

    Dim s As String = Iif(person Is Nothing, String.Empty, person.FirstName)
    

    将导致NullReferenceException 被抛出。

    【讨论】:

    • 很好,安东! Gerrie 可能确实读过 VB 中的 IIf 函数。
    • 是的,我可能误认为 VB.Net IIf 函数。谢谢。
    • IIF 函数(早在 Access 2 Basic 和早期 VBA 中就存在)由于前面提到的原因而不好。从 .NET 3.5 开始的 VB .NET 现在有一个 IF 运算符,从语法上看它看起来像 IIF,但它的行为类似于 ?:
    • 虽然 MSDN 确实将其称为条件运算符,但我认为我们大多数人将其称为三元运算符 - 因为它需要 3 个参数。 Iif() 通常称为 Inline If...我不确定人们如何称呼新的 VB9 If 运算符 - 除了 VB 的三元运算符...。
    【解决方案2】:

    仅用于简单的事情,例如

    Console.WriteLine(MyBool ? "It's true!" : "Nope");
    

    如果你尝试往里面添加逻辑,那么代码看起来真的很糟糕。

    【讨论】:

      【解决方案3】:

      我看到使用 ?: 而不是“常规” if-else 块的主要缺点是可读性和可维护性;大多数评论家认为 if-else 比?使用 if-else 重写它,从而使 if-else 从一开始就成为更好的选择。

      【讨论】:

      • 返回错误 == ERR_REOF ? “文件结束”:错误 == ERR_NOMEM ? “内存不足”:错误 == ERR_NOTFOUNT ? “找不到文件”:“未知错误”;我最喜欢的嵌套运算符的完美可读用法。
      【解决方案4】:

      继 Anton 的回复 - 请注意,这也是在 lambda 表达式中指定此类事物的唯一方法(对于 LINQ-to-[some db] 等)。

      缺点是,如果您要测试多项内容,可能会让人感到困惑。请参阅 discussion here 以了解使用/不使用谓词进行类型测试的示例。

      【讨论】:

        猜你喜欢
        • 2010-12-11
        • 2010-12-19
        • 2014-10-19
        相关资源
        最近更新 更多