Frage

Ich habe um ein wenig geschaut und haben keine entsprechende Frage gefunden.
Ist die schlechte Codierung der Praxis? Ich kann es leicht zu lesen, aber es ist zu kryptisch für jemanden, den Code zu lesen?

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

Bearbeiten: 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 wollte diese löschen und richtig machen, aber schon hatte 4 Antworten!

War es hilfreich?

Lösung

Ich würde hinzufügen Pars so klären, was los ist -. Dh

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

Damit würde ich mit ihm in Ordnung sein. Ohne sie, ich hatte es ein wenig zu studieren, um herauszufinden, was los war (wenn es sogar kompiliert - ich weiß nicht, die Reihenfolge der Operationen aus der Spitze von meinem Kopf:? Vs. ??)

Andere Tipps

Es ist 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 können die GetValueOrDefault Methode des Nullable Types anstelle des ?? Betreiber machen es besser lesbar:

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

EDIT: Die ursprüngliche Frage eine int? verwendet. Das ist nun behoben.

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

Typos beiseite, die Tatsache, dass Sie es geschrieben, ohne einfach 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 es auch keine gute Idee ist, wenn Sie es richtig machen.

Ich würde benötigen ein reales Beispiel, um zu sehen, aber ich glaube, ich würde in der Regel Split diese in eine Anweisung auf die Null-Koaleszenz-Operator und dann den Bedingungsoperator eine andere Verwendung. Ein weiteres Option ist das Verhalten von Nullable Types in Bezug auf Betreiber zu verwenden ... aber wieder, das ist vernünftig im Dunkeln. (Ich habe gerade selbst habe genau daran zu erinnern, was das Verhalten!)

Ich mag den Null-Koaleszenz Operator im Allgemeinen, aber ich denke, dass es mit dem Bedingungsoperator Kombination macht es nur ein wenig zu verschleiern. Ich denke, dass ich es wahrscheinlich in einem Fall annehmen würde, wo es ein signifikanter Vorteil war es ein einzelner Ausdruck (zB zur Initialisierung, wo die Alternative einer zusätzliche Methode ist die Einführung) zu sein, aber im Allgemeinen würde ich es vorziehen, sie in zwei Aussagen zu spalten.

EDIT: Eine Alternative in diese Fall ist, einfach vergleichen gegen "true" - das überflüssig aussieht, ist aber nicht im Fall von bool?

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

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

Ich denke, das ist einfacher: das Ergebnis nur „Ja“ ist, wenn testBool tatsächlich wahr ist; ansonsten ist es „Nein“. Wenn Sie auf „default“ auf Ja wollte, würde man schreiben:

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

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

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

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

(Edit:. Jonathan schlug mich mit einer Prise)

Sollte es nicht sein

bool? testbool = null;

Ich finde keine Notwendigkeit, eine nullable hier zu verwenden. Das macht mich zweimal überlegen, so würde ich es wirklich Code wie

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 dann den ?? Betreiber den Wert nach der Erklärung zu setzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top