2010-03-15 21 views
121

ich überall sehen Konstruktionen wie:Nullable ToString()

int? myVar = null; 
string test = myVar.HasValue ? myVar.Value.ToString() : string.Empty; 

Warum nicht einfach verwenden:

string test = myVar.ToString(); 

Ist das nicht genau das gleiche? Wenigstens sagt Reflector dass:

public override string ToString() 
{ 
    if (!this.HasValue) 
    { 
    return ""; 
    } 
    return this.value.ToString(); 
} 

Also, ist das richtig (die kürzere Version) oder ich bin etwas fehlt?

+0

Ich habe Code nicht so gesehen :) – mayu

Antwort

97

Sie sind ziemlich richtig. Auch in this question wird die vorherige Lösung vorgeschlagen, während niemand bemerkt, dass ToString() bereits die richtige Antwort gibt.

Vielleicht ist das Argument für die ausführlichere Lösung ist Lesbarkeit: Wenn Sie ToString() auf etwas rufen, die null sein soll, Sie in der Regel erwarten ein NullReferenceException, obwohl hier nicht geworfen wird.

+17

Eigentlich haben mindestens zwei Leute gemerkt: Eric Lippert und Johannes Rössel. –

+7

Obwohl ich sicher bin, dass das nicht gemeint ist, ist die Referenz hier nicht null. Nullable ist ein Werttyp. Dies ist der Grund, warum 'ToString()' aufgerufen wird, ohne dass 'NullReferenceException' ausgelöst wird. – Thorarin

14

Ich denke, dass viele Leute solche Überprüfungen haben, weil es kein natürliches Verhalten eines Objekts ist, das Nullwert halten kann.

+0

@Andrew, einverstanden, weil Leute (wie ich) zuerst denken, dass es eine Ausnahme werfen wird. –

+0

Ich hatte keine Ahnung, das war das Verhalten. Ich hätte definitiv gedacht, dass jedes Konstrukt, das für (x == null) wahr zurückgibt, auch eine NullReferenceException auslösen würde, wenn Sie x.ToString() aufrufen. –

3

kann es sein, nur Muster zu folgen? oder sie kennen das Backend nicht. Du hast Recht Code ist genau gleich. Sie können sogar tun:

int? i = null; 
i.ToString(); //No NullReferenceException 
+0

Sie müssen möglicherweise den langen Weg nehmen, wenn ToString() von invarianter Kultur sein muss, da NULL in ihrem Menü nicht enthalten ist. –

5

Nein, du bist richtig, ist die kürzere Version das gleiche wie das, was andere Leute in dieser Hinsicht getan haben, ist. Das andere Konstrukt, das ich dazu tendiere, eine Menge anstelle des Ternärs mit Nullwerten zu verwenden, ist der Koaleszenzoperator Null. was dich auch vor Nullen schützt. Für ToString() ist es nicht notwendig (wie Sie wies darauf hin), aber für Standard-int-Werte (zum Beispiel) es funktioniert gut, zum Beispiel:

int page = currentPage ?? 1; 

, dass Sie alle Integer-Operationen auf Seite lets do w/o erste ausdrücklich Null-Überprüfung und Aufruf des Werts in currentPage (wobei currentPage ein int ist? vielleicht als Parameter übergeben)

5

Ich weiß, lange nachdem es relevant war, aber ... ich vermute, dass es für NULL-Typen wie Int ist? Mit der .ToString() -Methode können Sie keine Formatzeichenfolgen verwenden. Siehe How can I format a nullable DateTime with ToString()?. Vielleicht gab es im ursprünglichen Code eine Format-Zeichenkette in .ToString(), oder vielleicht hat der Coder vergessen, dass .ToString() ohne die Format-Zeichenkette noch auf NULL-fähigen Typen verfügbar war.