2010-10-11 115 views

回答

32

假设你想要么是零或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 (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); 
+0

if textbox =“”然后通过ONE,否则通过TWO – 2010-10-11 20:53:29

+0

@eric u da da man谢谢你现在理解 – 2010-10-11 20:55:17

+1

@jenny:好吧,现在假设还有三个参数给M,每个*也*具有条件值。这是十六种可能性。你有16个不同的电话给M吗? – 2010-10-11 20:56:14

8

它的一个表现,所以你可以使用直接在赋值或函数调用中得到结果,而不必复制使用它的上下文。这使得大量的使用场景在写入和读取时显着更清晰。例如:

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

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

对我而言,这是一个关键点。您可以主观争论哪种方法更美观感染力和大量的将视情况而定,但具有abilitiy短路一个单独的声明语句和赋值语句(s)为显著。最终,三元操作扮演的角色不同于'如果',因为'if'对创建单独的代码分支非常有用,而'?'对于获得特定的价值是有用的。 – Steven 2010-10-11 21:29:41

2

有许多标准指南,都说不要使用三元运算。但是,除了goto和if之外,您可以认为所有语言功能都是不必要的。我有很多的时候使用它,如果然后elses。

+0

我喜欢这个答案 – 2010-10-11 20:55:54

2

它使得代码在某些人看来更具可读性,在语言中很多构造都是语法糖(考虑do..while,while..do和for(..)),并且在你选择适合你的任何一天(和你的团队)。

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

txtNumerator.SetDefault("0"); 
1

如果用IF-THEN构造,你最终有两个分配到相同的变量去,两单独的块。三元形式只有一个分配。因此,不需要查看第二个块来自行验证两个块是否正在对同一个变量执行赋值。在这方面,我认为三元形式更好。

在另一方面,如果C#的工作就像红宝石,如果是一个表达式,那么你可以没有三元操作和使用的if-else在这种情况下:

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

我宁愿因为那样的话可以删除不同的?:的语法。