2010-05-04 32 views
7

Con el operador ternario, es posible hacer algo como lo Func1 siguiente (suponiendo() y Func2() devuelven un int:operadores ternarios en C#

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

Sin embargo, ¿hay alguna manera de hacer el lo mismo, sin devolver un valor, por ejemplo, algo así como (suponiendo Func1() y Func2() de retorno void):?

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

comprendo que esto podría lograrse mediante una sentencia if, sólo se preguntó si había una forma de hacerlo así.

+1

Lo siento nitpick, pero el nombre correcto es el operador condicional http://msdn.microsoft.com/en-us/library/aa691313(VS.71).aspx –

+6

@Brian: En ese mismo artículo, "Se a veces también se llama operador ternario ". Entonces realmente, ambos se usan. –

+4

@Nelson - en la forma en que el signo de suma también se puede llamar un operador binario, y que el operador de incremento también se puede llamar operador unario? Sí ... pero todavía no es una forma correcta de nombrarlo, a pesar de ser el único operador ternario conocido. (¿Hay más? Buena pregunta.) – ANeves

Respuesta

10

extraño, pero que podría ser

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"); 
    } 
} 
+1

Eso es mucho trabajo adicional para evitar simplemente usar "if" y "else". Un buen fragmento, sin embargo. – GenericTypeTea

+0

Sí. Buen fragmento. – Ram

0

No, porque el operador ternario es una expresión, mientras que las acciones/funciones vacías son enunciados. Podrías hacer que devuelvan object, pero creo que un bloque if/else aclararía mucho más la intención (es decir, las acciones se están ejecutando por sus efectos secundarios en lugar de sus valores).

3

No lo creo. Por lo que recuerdo, el operador ternario se usa en un contexto de expresión y no como una declaración. El compilador necesita saber el tipo para la expresión y void no es realmente un tipo.

Se podría tratar de definir una función para esto:

void iif(bool condition, Action a, Action b) 
{ 
    if (condition) a(); else b(); 
} 

Y entonces se le puede llamar así:

iif(x > y, Func1, Func2); 

Pero esto realmente no hacer que el código más claro ...

1

Si tiene confianza, creará un método estático cuyo único propósito es absorber la expresión y "hacerla" una afirmación.

public static class Extension 
{ 
    public static void Do(this Object x) { } 
} 

De esta forma, puede llamar al operador ternario e invocar el método de extensión en él.

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

O, de una manera casi equivalente, escribiendo un método estático (si la clase cuando se quiere utilizar este "atajo" es limitado).

private static void Do(object item){ } 

... y decir que es de esta manera

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

Sin embargo, yo recomiendo encarecidamente que no utilice este "atajo" para los mismos motivos ya explicitados por los autores antes que yo.