【发布时间】:2009-02-05 12:09:26
【问题描述】:
我似乎记得在 C# 中避免使用立即 If 运算符 (?:),但我不知道我在哪里读到它以及它是什么。我认为这与在决定条件结果之前执行真假部分的事实有关。它是否正确?还是在 VB.Net 中是这样的?
【问题讨论】:
我似乎记得在 C# 中避免使用立即 If 运算符 (?:),但我不知道我在哪里读到它以及它是什么。我认为这与在决定条件结果之前执行真假部分的事实有关。它是否正确?还是在 VB.Net 中是这样的?
【问题讨论】:
它实际上称为条件运算符,在 MSDN 中称为“?:”。它基本上是if-else 的简写符号,除了这实际上是表达式,而不是语句。由于它等同于 if,因此该运算符没有任何警告。
您所读到的可能是关于 VB.NET 中的Iif 函数。作为一个函数,它在被调用之前评估它的所有参数,所以
Dim s As String = Iif(person Is Nothing, String.Empty, person.FirstName)
将导致NullReferenceException 被抛出。
【讨论】:
仅用于简单的事情,例如
Console.WriteLine(MyBool ? "It's true!" : "Nope");
如果你尝试往里面添加逻辑,那么代码看起来真的很糟糕。
【讨论】:
我看到使用 ?: 而不是“常规” if-else 块的主要缺点是可读性和可维护性;大多数评论家认为 if-else 比?使用 if-else 重写它,从而使 if-else 从一开始就成为更好的选择。
【讨论】:
继 Anton 的回复 - 请注意,这也是在 lambda 表达式中指定此类事物的唯一方法(对于 LINQ-to-[some db] 等)。
缺点是,如果您要测试多项内容,可能会让人感到困惑。请参阅 discussion here 以了解使用/不使用谓词进行类型测试的示例。
【讨论】: