2009-06-15 5 views
0

Ich habe mich ein wenig umgeschaut und habe keine gleichwertige Frage gefunden.
Ist das eine schlechte Programmierpraxis? Ich kann es leicht lesen, aber ist es zu kryptisch für jemanden, der den Code liest?Ist es schlecht, den Evaluator in einem ternären Ausdruck zu verschmelzen? (C#)

bool? testBool = null; 
string result; 
result = (testBool ?? false ? "Yes" : "No"); 

Edit: Ich entschuldige mich bei allen für eine schreckliche Code! Hier ist ein funktionierendes Beispiel ..
Ich bin ein wenig überwältigt von der Geschwindigkeit der Antworten. Ich würde das löschen und es richtig machen, aber hatte schon 4 Antworten!

+0

Ich denke, es ist obskur! –

+0

Ich denke, dieser Code wird nicht kompiliert als testbool ist Integer –

+1

Nach Ihren Änderungen kompiliert es, aber IMHO ist es nicht lesbar –

Antwort

10

Ich würde Parens hinzufügen, so dass klar ist, was los ist - dh.

bool? testbool = null; 
string result; 
result = (testbool ?? false) ? "Yes" : "No"; 

Damit wäre ich in Ordnung. Ohne es musste ich es ein wenig studieren, um herauszufinden, was vor sich ging (wenn es überhaupt kompiliert - ich weiß nicht die Reihenfolge der Operationen aus meinem Kopf für?: Vs. ??)

+4

+1, das hilft viel. Originalausdruck ist eine WTF (im Sinne des "einzig wahren Maßes der Codequalität - WTF/Minute") – peterchen

2

EDIT: Die ursprüngliche Frage verwendet eine int?. Es ist jetzt behoben worden.

Dieser Code wird nicht einmal kompilieren, also ja, ich würde sagen, es ist zu kryptisch. die Tatsache beiseite

Typos, dass Sie es geschrieben, ohne leicht Spek, dass es ein Problem gibt (Sie versuchen, eine bool auf der rechten Seite von der ?? zu verwenden, wenn der LHS ist ein int?) schlägt vor, es ist nicht ein gute Idee, auch wenn Sie es richtig machen.

Ich müsste ein reales Beispiel sehen, aber ich denke, ich würde normalerweise teilen diese in eine Anweisung mit dem Null Koaleszenz-Operator, und dann eine andere mit dem bedingten Operator. Eine andere Option ist das Verhalten der Nullable-Typen in Bezug auf Operatoren zu verwenden ... aber wieder ist das vernünftig Obskur. (Ich musste mich nur genau daran erinnern, was dieses Verhalten ist!)

Ich mag den Null-Koaleszenz-Operator im Allgemeinen, aber ich denke, die Kombination mit dem bedingten Operator macht es nur ein wenig zu verdunkeln. Ich denke, ich würde es wahrscheinlich in einem Fall akzeptieren, wo ein signifikanter Vorteil darin besteht, dass es ein einzelner Ausdruck ist (z.B. für die Initialisierung, wo die Alternative eine zusätzliche Methode einführt), aber im Allgemeinen würde ich es lieber in zwei Anweisungen aufteilen.

EDIT: Eine Alternative in dieser Fall ist, nur zu vergleichen, gegen „true“ - die überflüssig aussieht, ist aber nicht im Fall von bool?:

result = (testBool == true) ? "Yes" : "No"; 

Die Klammern sind nicht erforderlich natürlich, aber fügen Sie Klarheit IMO.

Ich denke, das ist einfacher: Das Ergebnis ist nur "Ja", wenn testBool tatsächlich wahr ist; sonst ist es "Nein". Wenn Sie "Standard" auf Ja möchten, würden Sie schreiben:

result = (testBool == false) ? "No" : "Yes"; 
+0

Sie haben recht, ich versuche, ein Beispiel zu veröffentlichen, ohne den Produktionscode tatsächlich zu referenzieren. Ich werde die Frage löschen, sobald ich ein richtiges Beispiel gemacht habe. – CaptainCasey

+0

kann nicht gelöscht werden .. edit muss ausreichen. – CaptainCasey

1

Wickeln Sie es und ich denke, es ist in Ordnung.

string result = (testbool ?? false) ? "Yes" : "No"; 

Ansonsten ist die beabsichtigte Reihenfolge der Operationen, selbst wenn es funktioniert, nicht offensichtlich.

(Edit: Jonathan schlug mich durch eine Prise.)

0

Sollte es nicht

bool? testbool = null; 

sein?

Ich brauche hier keine NULL-Werte zu verwenden. Das macht mich zweimal überlegen, so würde ich es wirklich Code als

bool testbool = false; 
string result; 
result = testbool ? "Yes" : "No"; 

Ich weiß nicht, ob Ihr Beispiel unvollständig war, aber ich denke, die Variable auf den Standardwert initialisiert ist saner als ein NULL-Werte zulässt und anschließend das ?? Operator, um den Wert nach der Deklaration festzulegen.

2

es ein bisschen auf der kryptischen Seite, es ist nicht einmal klar, ob der Ausdruck als ausgewertet wird:

string result = (testbool ?? false) ? "Yes" : "No"; 

oder:

string result = testbool ?? (false ? "Yes" : "No"); 

Sie die GetValueOrDefault Methode des Nullable Types können stattdessen der ?? Operator, um es lesbarer zu machen:

bool? testbool = null; 
string result = (testbool.GetValueOrDefault(false) ? "Yes" : "No"); 
Verwandte Themen