2010-05-04 9 views
7

Mit dem ternären Operator ist es möglich, so etwas wie die folgende (unter der Annahme Func1() und Func2() gibt einen int zu tun:Ternary Operatoren in C#

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

Allerdings ist es eine Möglichkeit, das zu tun gleiche, ohne einen Wert zurückkehrt zum Beispiel so etwas wie (unter der Annahme Func1() und Func2() return void):

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

ich weiß, dies erreicht werden könnte, eine if-Anweisung, fragte ich mich nur, wenn es ein Weg, es so zu machen.

+1

Entschuldigen Sie, um zu picken, aber der richtige Name ist der bedingte Operator http://msdn.microsoft.com/en-us/library/aa691313(VS.71).aspx –

+6

@Brian: In demselben Artikel "Es wird manchmal auch als ternärer Operator bezeichnet ". Also, beide werden benutzt. –

+4

@Nelson - in der Weise, dass das Summenzeichen kann auch ein binärer Operator genannt werden, und dass der Inkrementierung Operator kann auch unäre Operator genannt werden? Ja ... aber es ist immer noch nicht die richtige Art, es zu benennen, obwohl es normalerweise der einzige bekannte ternäre Operator ist. (Gibt es mehr? Gute Frage.) – ANeves

Antwort

10

Seltsam, aber man konnte tun

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

Das ist eine Menge zusätzlicher Arbeit, um zu vermeiden, nur "wenn" und "sonst" zu verwenden. Netter Ausschnitt. – GenericTypeTea

+0

Ja. Schönes Schnipsel. – Ram

0

Nein, weil der ternäre Operator ein Ausdruck ist, während action/void Funktionen Anweisungen sind. Sie könnten sie zurückgeben object, aber ich denke, dass ein If/Else-Block würde die Absicht viel klarer machen (d. H. Die Aktionen werden für ihre Nebenwirkungen anstelle ihrer Werte ausgeführt).

3

Ich glaube nicht. Soweit ich mich erinnere, wird der ternäre Operator in einem Ausdruck Kontext und nicht als eine Aussage verwendet. Der Compiler muss den Typ für den Ausdruck kennen und void ist nicht wirklich ein Typ.

könnten Sie versuchen, eine Funktion für diese zu definieren:

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

Und dann könnte man es so nennen:

iif(x > y, Func1, Func2); 

Aber dieser Code nicht wirklich noch klarer machen ...

1

Wenn Sie sich sicher fühlen, würden Sie eine statische Methode erstellen, deren einziger Zweck es ist, den Ausdruck zu absorbieren und es zu einer Aussage zu machen.

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

Auf diese Weise können Sie den ternären Operator aufrufen und die Erweiterungsmethode darauf aufrufen.

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

Oder in einem fast gleichwertigen Art und Weise, eine statische Methode zu schreiben (wenn die Klasse, wenn Sie diese „Abkürzung“ verwenden möchten, ist begrenzt). explizit von den Autoren vor mir

private static void Do(object item){ } 

... und es auf diese Weise ruft

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

Jedoch habe ich diesen „Abkürzung“ stark reccomend nicht bereits für denselben Gründen.