Ich sehe überall Konstruktionen wie:
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? Zumindest sagt Reflector Folgendes:
public override string ToString()
{
if (!this.HasValue)
{
return "";
}
return this.value.ToString();
}
Also, ist das richtig (die kürzere Version) oder fehlt mir etwas?
Antworten:
Du bist ganz richtig. Auch in dieser Frage wird die erstere Lösung vorgeschlagen, während niemand bemerkt, dass
ToString()
bereits die richtige Antwort vorliegt.Vielleicht ist das Argument für die ausführlichere Lösung Lesbarkeit: Wenn Sie rufen
ToString()
auf etwas, das soll seinnull
, Sie in der Regel erwarten einNullReferenceException
, obwohl hier nicht geworfen wird.quelle
ToString()
funktioniert das Anrufen, ohne dassNullReferenceException
es geworfen wird..HasValue
, diese Ausnahme immer noch zu werfen.myNullableDateTime.HasValue ? myNullableDateTime.Value.ToString("d") : null
wo Sie das entpackte Objekt benötigen, um auf die gewünschteToString
Methode zuzugreifen . Natürlich gibt es auch dafür eine$"{myNullableDateTime:d}"
Ich denke, dass viele Leute solche Prüfungen haben, weil es kein natürliches Verhalten eines Objekts ist, das einen Nullwert enthalten kann.
quelle
Nein, Sie haben Recht, die kürzere Version ist die gleiche wie die, die andere Leute in dieser Hinsicht getan haben. Das andere Konstrukt, das ich häufig anstelle des ternären Konstrukts mit nullables verwende, ist der Null-Koaleszenzoperator. Das schützt Sie auch vor Nullen. Für ToString () ist es nicht erforderlich (wie Sie bereits betont haben), aber für Standard-Int-Werte (zum Beispiel) funktioniert es gut, z.
Auf diese Weise können Sie alle Ganzzahloperationen auf Seite ausführen, ohne zuerst explizit null zu prüfen und den Wert in currentPage aufzurufen (wobei currentPage ein int ist, das möglicherweise als Parameter übergeben wird).
quelle
Ich weiß, lange nachdem es relevant war, aber ... Ich vermute, es liegt daran, dass für nullbare Typen wie int? Mit der .ToString () -Methode können Sie keine Formatzeichenfolgen verwenden. Siehe Wie kann ich mit ToString () eine nullfähige DateTime formatieren? . Möglicherweise gab es im Originalcode eine Formatzeichenfolge in .ToString (), oder der Codierer hat vergessen, dass .ToString () ohne die Formatzeichenfolge für nullfähige Typen noch verfügbar war.
quelle
kann es sein, nur um Muster zu folgen? oder sie kennen das Backend nicht. Sie haben Recht, Code ist genau das gleiche. Sie können sogar tun:
quelle
int?
ist Syntaxzucker, der die Deklaration einer nullbaren Variablen vereinfacht. Es ist das gleiche wieNullable<int>
.Wenn Sie sich also die Implementierung der
ToString()
Methode fürNullable<T>
(siehe unten) ansehen , können Sie feststellen, dass sie eine leere Zeichenfolge zurückgibt, falls sie keinen Wert hat.Was MSDN sagt:
Der folgende Code gibt also eine leere Zeichenfolge an die Konsole aus, anstatt eine
ArgumentNullException
Ausnahme auszulösen .quelle