C# ?: Expression

本文关键字:Expression | 更新日期: 2023-09-27 18:20:55

我有一个函数有多个if(这不是实际代码

if(n == 1)
   m = 1;
if(n == 2)
   m = 2;
if(n == 3)
   m = 3;

相反,我想把它们都变成?:表达式:

(n == 1) ? m = 1;

但它表示,它期待着一个":"

我熟悉?:来自C++的表达式,您可以简单地编写:

(n == 1) ? m = 1 : 0;

但0不接受此处。这是一个荒谬的问题,我甚至在谷歌上找不到答案,因为它忽略了"?:"作为一个词。

答案:评论中的答案太糟糕了。在这个表达式中没有"无所事事"的方法,我应该使用if-else或switch。谢谢

C# ?: Expression

看起来你在寻找:

m = (n == 1) ? 1 : 0;

然后你可以级联到:

m = (n == 1) ? 1 : (n == 2) ? 2 : (n == 3) ? 3 : 0;

一个重要的(无论如何,对我来说),旁白:

为什么你问这个?如果是因为您认为此表单将比一系列if语句或switch语句更高效,则不要。C#编译器和.net JIT编译器真的很聪明,他们会把你的代码(希望如此!)转换成最优化的形式。把你的编码写成你自己可以理解的,或者开发人员必须在你之后尽可能地维护它。如果你得到的性能不可接受,然后尝试改变它,但测量以确定什么最有效(请记住,较新的编译器/.net框架很可能会改变发生的情况)。

在c#中查找三元运算符将得到相关结果。

就是一个例子

var m = n == 1 ? 1 : 0

可能:

m = (n == 1) ? 1 : (n == 2) ? 2 : (n == 3) ? 3 : m;

m = n

编辑:简化:

variable2 = (variable1 == value) ?
             variable1 :
             variable2;

您想要的是:

m = (n == 1) ? 1 : 0;

要将它们全部嵌套,它看起来是这样的:

m = (n == 1) ? 1 : (n == 2) ? 2 : (n == 3) ? 3 : 0;

但正如你所看到的,这确实不太容易阅读和理解。添加额外的括号会有所帮助,但我认为您最好使用if-else树。

m = (n == 1) ? 1 : m

如果n=1,则M等于1,否则M

仅供参考,?被称为Ternery算子。在MSDN 上查找用法

致问候,

您可以编写:

m = (n==1) ? 1 : m;

但国际海事组织认为,这比最初的代码更难阅读,也更丑陋。

(n == 1) ? m = 1 : 0;

这是不允许的,因为C#不允许将任意表达式作为语句。方法调用和赋值是允许的,而大多数其他表达式则不允许。

一个语句是针对其副作用执行的,一个表达式是针对其值执行的。因此,一句话的最外层有副作用是很自然的。?:从来没有副作用,所以它不允许作为一个语句。

试试这个:

m = (n == 1) ? 1 : 0;

这不是用三元if/else运算符解决的问题-它显然是switch语句的理想候选者(使用switch可能比使用一系列三元运算符更有效)

如果您希望将If语句音译为?:,那么很简单:

if ({condition}) {then-code}; else {else-code};

成为

{condition} ? {then-code} : {else-code};

唯一的限制是then/else代码是单个语句。

?的主要好处:(对于现代编译器)就是它可以嵌入到一个语句中,以显著压缩源代码——有时这有助于可读性,有时它只是用来混淆代码的含义——小心使用它。