Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#中立即if运算符(?:)的可能缺点?_C#_.net - Fatal编程技术网

C#中立即if运算符(?:)的可能缺点?

C#中立即if运算符(?:)的可能缺点?,c#,.net,C#,.net,我似乎还记得一些关于在C#中避免立即If操作符()的事情,但我不知道我在哪里读到它以及它是什么。我认为这与事实有关,在决定条件的结果之前,正确和错误的部分都被执行。这是正确的吗?或者在VB.Net中是这样的?它实际上被称为条件运算符,在MSDN中被称为“?:”。它基本上是if-else的简写符号,只是它实际上是表达式,而不是语句。因为它相当于if,所以该操作符没有任何警告 您所阅读的内容可能是关于VB.NET中的Iif函数。作为一个函数,它在被调用之前对所有参数进行求值,所以 Dim s As

我似乎还记得一些关于在C#中避免立即If操作符()的事情,但我不知道我在哪里读到它以及它是什么。我认为这与事实有关,在决定条件的结果之前,正确和错误的部分都被执行。这是正确的吗?或者在VB.Net中是这样的?

它实际上被称为条件运算符,在MSDN中被称为“?:”。它基本上是
if-else
的简写符号,只是它实际上是表达式,而不是语句。因为它相当于
if
,所以该操作符没有任何警告

您所阅读的内容可能是关于VB.NET中的
Iif
函数。作为一个函数,它在被调用之前对所有参数进行求值,所以

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

将导致抛出
NullReferenceException

根据Anton的回答-注意,这也是在lambda表达式中指定此类内容的唯一方法(对于LINQ to-[some db]等)


不利的一面是,如果您正在测试多个东西,它可能会变得混乱。有关使用/不使用谓词的类型测试的示例,请参见。

我在使用中看到的主要缺点是:与“常规”if-else块不同,if-else块是关于可读性和可维护性的;大多数评论家认为if-else比?::更清晰,即使我认为这是关于个人品味的问题,但显而易见,如果你需要在任何分支中的?:语句中添加指令,你需要使用if-else完全重写它,从而从一开始就让if-else成为更好的选择。

只在诸如

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

如果您试图在内部添加逻辑,那么代码看起来非常糟糕。

很好,Anton!Gerrie可能读过VB中的IIf函数。是的,我可能误解了VB.NETIIF函数。谢谢。由于前面提到的原因,IIF函数(早在Access 2 Basic和早期VBA中就存在)不好。从.NET 3.5开始,VB.NET现在有一个IF运算符,从语法上看,它看起来像IIF,但它的行为像?:尽管MSDN确实将其称为条件运算符,但我认为我们大多数人都将其称为三元运算符,这是因为它需要3个参数。Iif()通常被称为内联If…我不确定人们称新的VB9 If运算符是什么-除了VB的三元运算符之外…返回error==ERR\u REOF?“文件结束”:错误==错误名称?“内存不足”:错误==ERR\u NOTFOUNT?“未找到文件”:“未知错误”;我最喜欢的嵌套运算符的完全可读的用法。