【问题标题】:what is the point of using ternary operators instead of IF THEN? [closed]使用三元运算符而不是 IF THEN 有什么意义? [关闭]
【发布时间】:2011-04-24 00:23:58
【问题描述】:

为什么要让事情变得更复杂?为什么这样做:

txtNumerator.Text = 
     txtNumerator.Text == "" ? "0" : txtNumerator.Text;

而不是这个:

if txtNumerator.Text="" {txtNumerator.Text="0";}

【问题讨论】:

  • 我想你会喜欢 ??运算符。

标签: c#


【解决方案1】:

假设您想将零或 txtNumerator.Text 传递给方法 M。您会怎么做?

你可以说:

string argument;
if (txtNumerator.Text == "")
{
    argument = "0";
}
else
{
    argument = txtNumerator.Text;
}
M(argument);

或者你可以说

M(txtNumerator.Text == "" ? "0" : txtNumerator.Text);

后者更短,更容易阅读。

这里更重要的一点是,语句对其副作用有用,而表达式对其有用>。如果您想要控制两种副作用中的哪一种发生,请使用“if”语句。如果您想要控制从两种可能性中选择哪个值,请考虑使用条件表达式。

更新:

珍妮问为什么不这样做?

if (txtNumerator.Text == "")
{
    M("0");
}
else
{
    M(txtNumerator.Text);
}

如果只有一个条件要检查,那很好。但是如果有四个呢?现在有十六种可能性,写“if”语句至少可以说是一团糟:

if (text1.Text == "")
{
    if (text2.Text == "")
    {
        if (text3.Text == "")
        {
            if (text4.Text == "")
            {
                M("1", "2", "3", "4");
            }
            else
            {
                M("1", "2", "3", text4.Text);
            }
        }
        else
        {
            if (text4.Text == "")
            {
                M("1", "2", text3.Text, "4");
            }
            else
            {
                M("1", "2", text3.Text, text4.Text);
            }
        }
        ... about fifty more lines of this.

相反,你可以说:

M(Text1.Text == "" ? "1" : Text1.Text,
  Text2.Text == "" ? "2" : Text2.Text,
  Text3.Text == "" ? "3" : Text3.Text,
  Text4.Text == "" ? "4" : Text4.Text);

【讨论】:

  • 如果 textbox="" 则通过一个,否则通过两个
  • @jenny:好的,现在假设 M 还有三个参数,每个参数 also 都有一个条件值。那是十六种可能。你会对 M 进行 16 次不同的调用吗?
  • * conditional operator * 在派生类型初始化期间要调用基类构造函数并且需要传递从参数计算的值时也很有用:class Foo : Bar { Foo( string txt ) : base( txt == "" ? "0" : txt ) } - for实例。您也可以编写静态成员来执行此操作,但在这种情况下使用 ?: 会更方便。
  • @LBushkin 提出了一个很好的观点。在 C# 中有许多上下文,其中 statement 是非法的,但 expression 是合法的。在某些情况下,您希望能够表达做出选择的概念,但“if”语句不可用,因为它是一个语句。
  • @Ben:正确; C# 不允许 lambda 中的语句转换为表达式树。我们现在有一个包含语句的表达式树库,所以理论上我们可以这样做。这并不是一个优先事项,因为构建“语句 lambda”表达式树不会启用任何新的 LINQ 场景。
【解决方案2】:

这是一个表达式,因此您可以直接在赋值或函数调用中使用结果,而无需复制使用它的上下文。这使得许多使用场景的读写更加清晰。例如:

int abs = (x >= 0) ? x : -x;

int abs;
if (x >= 0)
    abs = x;
else
    abs = -x;

【讨论】:

  • 这对我来说是一个关键点。您可以就哪种方法在美学上更具吸引力提出主观争论,这在很大程度上取决于具体情况,但是能够将单独的声明语句和赋值语句短路是很重要的。最终,三元运算与“if”的作用不同,因为“if”对于创建单独的代码分支很有用,而“?”对于获取特定值很有用。
【解决方案3】:

有许多标准指南说不要使用三元运算符。但是,您可能会同意,除了 goto 和 if 之外,所有语言功能都是不必要的。当有大量 if then else 时,我会使用它。

【讨论】:

    【解决方案4】:

    在某些人看来,它使代码更具可读性,语言中的许多结构都是语法糖(想想 do..while、while..do 和 for(..)),并且在哪一天你选择适合你(和你的团队)的东西。

    例如我认为上面的代码应该用扩展方法来实现:

    txtNumerator.SetDefault("0");
    

    【讨论】:

      【解决方案5】:

      如果你使用 if-then 结构,你最终会在两个单独的块中对同一个变量进行两次赋值。三元形式只有一个赋值。因此,无需查看第二个块来验证两个块正在执行对同一变量的赋值。在这方面,我认为三元形式读起来更好。

      另一方面,如果 C# 像 Ruby 一样工作并且 if 是一个表达式,那么您可以不使用三元运算符并在这种情况下使用 if-else:

      txtNumerator.Text = if (txtNumerator.Text == "" ) "0"; else (txtNumerator.Text);
      

      我更喜欢这样,因为这样可以删除 ?: 的不同语法。

      【讨论】:

        猜你喜欢
        • 2014-06-16
        • 1970-01-01
        • 2013-10-09
        • 2012-08-02
        • 2020-12-07
        • 1970-01-01
        • 2019-05-21
        • 2016-05-03
        • 2022-08-03
        相关资源
        最近更新 更多