C# ?:表达式

6

我有一个函数,其中包含多个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。谢谢。


是的,谷歌一个问号很难。这被称为三元运算符。 - DOK
8
一个“if”语句在满足条件时执行一条语句。一个条件表达式在满足条件时选择要评估的表达式,在C#中,必须对该表达式进行某些处理(与C ++不同,其中可以执行表达式的副作用)。您正在以奇怪的方式混合这两种风格,请不要这样做。通常是不可能的,当可能时,它也非常令人困惑。使用switch或if-else; 这样更易读。 - Eric Lippert
3
它被称为“条件运算符”。它恰好是C#中唯一的三元运算符,因此人们有时称其为“三元运算符”,因为只有它一个。但更好的做法是根据其“目的”而不是“形式”来描述一个东西。 - Eric Lippert
可能是三元运算符如何工作?的重复问题。 - Grant Thomas
这里有两个问题。第一个是 C#中的运算符?:如何工作? 第二个是 表达这些if语句链所代表的逻辑的最佳方式是什么? 在我看来,对于第二个问题的答案不是使用?: - grossvogel
1
“示例代码应该是代表性的,同时又完整且简洁。给定的示例并不是一个好的代表。考虑选择一个有意义的用户名。其中一个优点是其他人可以使用@回复,并且您将收到通知,以便知道有人在评论中提到了您。” - outis
8个回答

14

看起来您正在寻找:

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

然后您可以将它级联到:

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

一个很重要的(对我来说至少是)旁注:

为什么你要问这个问题?如果你认为使用这种形式会比一系列的if语句或者switch语句更有效率,那就不要这样做。C#编译器和.net JIT编译器非常聪明,它们会把你的代码(希望如此!)转换成最优化的形式。让你的代码尽可能地易于自己或在你之后需要维护它的开发人员理解。如果你得到的性能不能接受,那么尝试改变它,但要测量以确定哪种方法最好(记住,新的编译器/.net框架可能会改变发生的事情)。


哇,我没有意识到你可以把它们链接在一起。 - DOK
7
@DOK - 你可以这样做,但这并不意味着它会产生易读的代码,反而可能会让代码难以理解!;=) - Rob
@Rob 这并不是必须的。不确定C#是否有#define,但在C/C++中我会这样做。 - Pubby
@CodeInChaos 是的。 但它不能用于宏。 - GameZelda
@ Pubby C# 没有宏,因此您不能在 C# 中执行此操作。 @GameZelda 谢谢,我的评论有点草率。 - CodesInChaos
@Rob 合理的嵌套是解决这段丑陋代码的方法。像那样一连串地使用 if 语句同样会让代码难以阅读,我个人认为。 - JoeBrockhaus

2

搜索将会给您相关的结果。

一个使用示例如下:

var m = n == 1 ? 1 : 0

2
条件运算符?:是一个三元运算符,因为它需要三个参数。即使C#目前只有一个三元运算符,我也不会称其为“the”三元运算符。 - CodesInChaos
1
我认为这应该是一条注释。 - CodesInChaos
我建议使用三元条件运算符 - Pubby
1
提问者说他在Google上找不到相关信息。C#中的三元运算符将为您提供更多的信息来咀嚼。 - flq

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

或者

m = n

编辑: 简化:

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

@user779444 这不是一个很好的例子。从我的回答中很容易理解如何做到这一点。 - Gilad Naaman

1
你可以写成这样:
m = (n==1) ? 1 : m;

但在我看来,这比原始代码更难读,更丑陋。

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

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

语句执行其副作用,表达式执行其值。因此,语句的最外层部分具有副作用是很自然的。 ?: 永远没有副作用,因此不能作为语句使用。


1

你想要这样:

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

如果要嵌套它们,看起来会像这样:

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

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


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

意思是:

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

顺便提一下,? 叫做三元运算符。在 MSDN 上找到用法 链接

此致敬礼,


0

试试这个:

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

0

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

如果你想将if语句转换为?:,那么很简单:

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

变成

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

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

使用?:(在现代编译器中)的主要好处是它可以嵌入到语句中以显著压缩源代码 - 有时这可以帮助可读性,有时它只是用来混淆代码的含义 - 谨慎使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接