C#中的三元运算符

Posted

技术标签:

【中文标题】C#中的三元运算符【英文标题】:Ternary operators in C# 【发布时间】:2011-02-15 11:02:24 【问题描述】:

使用三元运算符,可以执行以下操作(假设 Func1() 和 Func2() 返回一个 int:

int x = (x == y) ? Func1() : Func2();

但是,有没有办法做同样的事情,而不返回一个值?例如,类似(假设 Func1() 和 Func2() 返回 void):

(x == y) ? Func1() : Func2();

我意识到这可以使用 if 语句来完成,我只是想知道是否有办法做到这一点。

【问题讨论】:

抱歉吹毛求疵,但正确的名称是条件运算符msdn.microsoft.com/en-us/library/aa691313(VS.71).aspx @Brian:在同一篇文章中,“有时也称为三元运算符”。真的,两者都被使用了。 @Nelson - 和符号也可以称为二元运算符,增量运算符也可以称为一元运算符?是的......但它仍然不是一个正确的命名方式,尽管它通常是唯一已知的三元运算符。 (还有更多吗?好问题。) 是的,三元(以及相关的一元、二元等)是更通用的名称。因此,条件运算符是三元运算符(如果语言语法没有提供另一种,则为“三元运算符”),但三元运算符不一定是条件运算符。我认为在编程语言的上下文中,两者通常会被理解为同一个意思。除非有更多,就像你说的那样。 在 Google 中搜索“C#“三元运算符”和“C#“条件运算符”返回的结果数量相似,因此看起来它们的使用频率大致相同。 【参考方案1】:

很奇怪,但你可以做到

class Program

    private delegate void F();

    static void Main(string[] args)
    
        ((1 == 1) ? new F(f1) : new F(f2))();
    

    static void f1()
    
        Console.WriteLine("1");
    

    static void f2()
     
        Console.WriteLine("2");
    

【讨论】:

为了避免只使用“if”和“else”,需要做很多额外的工作。不错的 sn-p。【参考方案2】:

我不这么认为。据我记得,三元运算符用于表达式上下文,而不是作为语句。 编译器需要知道表达式的类型,而void 并不是真正的类型。

您可以尝试为此定义一个函数:

void iif(bool condition, Action a, Action b)

    if (condition) a(); else b();

然后你可以这样称呼它:

iif(x > y, Func1, Func2);

但这并没有真正让你的代码更清晰......

【讨论】:

【参考方案3】:

如果您有信心,您可以创建一个静态方法,其唯一目的是吸收表达式并“使其”成为一个语句。

public static class Extension

    public static void Do(this Object x)  

这样你就可以调用三元运算符并调用它的扩展方法。

((x == y) ? Func1() : Func2()).Do(); 

或者,以几乎等效的方式,编写一个静态方法(如果你想使用这个“快捷方式”的类是有限的)。

private static void Do(object item) 

...并以这种方式调用它

Do((x == y) ? Func1() : Func2());

但我强烈建议不要使用此“快捷方式”,原因与我之前的作者已经明确说明的相同。

【讨论】:

【参考方案4】:

不,因为三元运算符是一个表达式,而动作/无效函数是语句。您可以让它们返回 object,但我认为 if/else 块会使意图更加清晰(即,执行这些操作是因为它们的副作用而不是它们的值)。

【讨论】:

以上是关于C#中的三元运算符的主要内容,如果未能解决你的问题,请参考以下文章

三元?运算符与 C# 中的传统 If-else 运算符 [重复]

Delphi - 相当于 C# 的三元运算符? [复制]

C# 中哪个三元运算符最流行和最常用? [关闭]

LINQ 查询中使用的 C# 三元运算符

C# - Dictionary 和 Object[] 之间的三元运算符

在 C# 中创建元组时编译错误,没有括号包围三元运算符