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。谢谢
看起来你在寻找:
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代码是单个语句。
?的主要好处:(对于现代编译器)就是它可以嵌入到一个语句中,以显著压缩源代码——有时这有助于可读性,有时它只是用来混淆代码的含义——小心使用它。