2016-12-05 2 views
0

ich diesen Code haben, wo LongMethodWithResult ist ein Verfahren, das eine lange Zeit dauert, laufen:Concise Art und Weise der Verwendung von Konditionaloperator

object o = LongMethodWithResult() == someVal ? LongMethodWithResult() : someOtherResult; 

Nun ist die LongMethodWithResult Methode zweimal ausgewertet wird, ist es nicht?

Ich weiß, ich könnte eine Methode schreiben, die Variablen zu speichern, das Ergebnis des langen Verfahrens, so etwas wie diese verwendet:

public static object ConciseConditionalOperator(object a, object b, object c) 
{ 
    return a == b ? a : c; 
} 

Aber ich würde interessieren, ob es eine beste Art und Weise zu tun, Dies oder einige Funktionen, die von C# oder .NET bereitgestellt werden.

Alle Ideen sind willkommen!

+4

In Ihrem Fall können Sie nicht tun 'Objekt o = LongMethodWithResult() == someVal? someVal: someOtherResult; '? – KMoussa

+0

Ich würde als Faustregel die Verwendung von bedingten Ausdrücken auf einfache logische Ausdrücke ohne Nebenwirkungen begrenzen, die eine Auswahl zwischen zwei Werten auslösen. Das typische Beispiel von K & R ist die Auswahl zwischen einem plural s und einem leeren String beim Drucken eines Textes, abhängig von einer Zahl! = 1. –

+0

Um @ PeterBs (noch aufschlussreiche) Abkürzung zu vermeiden, könnten Sie nach einer anderen Beziehung als Identität fragen, z. 'LongMethodWithResult() <= einigeVal? ... ' –

Antwort

0

Generell haben Sie recht. In Ihrem Beispiel wird LongMethodWithResult zweimal ausgeführt. Um zu vermeiden, dass, müssen Sie zuerst speichern das Ergebnis LongMethodWithResult:

var result = LongMethodWithResult(); 
object o = result == someVal ? result : someOtherResult; 

Wie Peter B, die in Ihrer Antwort, das Beispiel vorausgesetzt, Sie ist ein besonderer Fall, in dem Sie das nicht brauchen, als wenn LongMethodWithResult() ‚s Ergebnis entspricht einem Wert, den Sie bereits kennen, es ist nicht notwendig, es erneut aufzurufen. Sie können nur den Wert zurückgeben, den Sie bereits kennen.

jedoch oftmals folgendes notwendig:

var result = LongMethodWithResult(); 
object o = result == null ? defaultResult : result; 

können Sie jedoch das letzte Konstrukt mit einem einfachen ersetzen:

object o = LongMethodWithResult() ?? defaultResult; 
+1

... und für letzteres bietet C# das elegante 'object o = LongMethodWithResult() ?? Standardergebnis; '. –

+0

@ PeterA.Schneider Ja, ich wollte das schreiben, aber einen Anruf von einem Kunden gehen. –

+0

Blutige Ablenkungen von den wichtigen Sachen ;-). –

4

In diesem speziellen Fall könnten Sie verwenden:

object o = LongMethodWithResult() == someVal ? someVal : someOtherResult; 


Wenn Sie eine andere Schreibweise, oder wenn Sie zweimal someVal Angabe vermeiden wollen, dann können Sie eine Erweiterungsmethode erstellen (in einem statischen Klasse):

public static T IfEqualThenElse<T>(this T valueToCheck, T value1, T value2) 
    where T : System.IEquatable<T> 
{ 
    return valueToCheck.Equals(value1) ? value1 : value2; 
} 

Verbrauch:

var o = LongMethodWithResult().IfEqualThenElse(someVal, someOtherResult); 
+0

danke für Ihre Antwort! – florien

Verwandte Themen