2010-10-11 13 views

Respuesta

32

Suponga que desea pasar a cero o txtNumerator.Text a un método M. ¿Cómo hacer eso?

Se podría decir:

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

O se podría decir

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

Este último es más corto y más fácil de leer.

El punto más importante aquí es que declaraciones son útiles por sus efectos secundarios y expresiones son útiles por sus valores . Si lo que quiere hacer es controlar cuál de dos efectos secundarios ocurre, entonces use una declaración "si". Si lo que quieres hacer es controlar qué valor se elige entre dos posibilidades, considera usar una expresión condicional.

ACTUALIZACIÓN:

Jenny se pregunta ¿por qué no hacerlo?

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

Eso está bien si solo hay una condición para verificar. Pero, ¿y si hay, digamos, cuatro? Ahora hay dieciséis posibilidades y escribir el "if" para ello se complica por decir lo menos:

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. 

En cambio, sólo puede decir:

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

if textbox = "" luego pasa UNO, más pasa DOS –

+0

@eric u da man gracias ahora entiendo –

+1

@jenny: Bien, ahora supongamos que hay tres argumentos más para M, cada uno de los cuales * también * tenía un valor condicional. Eso son dieciséis posibilidades. ¿Tendría dieciséis llamadas diferentes a M? –

8

Es una expresión, por lo que puede utilizar el resultado directamente en una tarea o llamada de función sin tener que duplicar el contexto en el que la está utilizando. Eso hace que muchos escenarios de uso sean significativamente más limpios para escribir y leer. Por ejemplo:

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

frente

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

Esto, para mí, es una especie de punto clave. Puede hacer argumentos subjetivos sobre qué enfoque es más atractivo desde el punto de vista estético y mucho dependerá de la situación, pero tener la capacidad de cortocircuitar una declaración de declaración separada y una declaración de asignación es significativa. En última instancia, la operación ternaria juega un papel diferente que el 'si', porque 'si' es útil para crear ramas de código separadas, mientras que '?' es útil para obtener un valor particular. – Steven

2

Hay muchos estándares guías que dicen no utilizar el operador ternario. Sin embargo, podría coincidir en que todas las funciones de idioma son innecesarias, excepto goto y if. Lo uso cuando tengo una gran cantidad de si entonces elses.

+0

me gusta esta respuesta –

2

Hace que el código sea más legible en opinión de algunas personas, muchas construcciones en el lenguaje son azúcar sintáctica (piense en hacer ... mientras, mientras ... haga, y para (..)) y al final de el día que elijas lo que funcione para ti (y tu equipo).

Yo, por ejemplo, piensan que el código anterior debe ser implementado con un método de extensión:

txtNumerator.SetDefault("0"); 
1

Si vas con la si-entonces construir, se termina con dos asignaciones a la misma variable, en dos bloques separados La forma ternaria tiene solo una asignación. Entonces, no hay necesidad de mirar un segundo bloque para verificar usted mismo que ambos bloques están realizando una asignación a la misma variable. En ese sentido, creo que la forma ternaria se lee mejor.

Por otro lado, si C# trabajó como Ruby y si era una expresión, entonces usted podría hacer sin que el operador ternario y utilizar if-else en ese caso:

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

el que yo preferiría porque entonces el diferente sintaxis de?: podría ser eliminada.

Cuestiones relacionadas