150 Stimmen

Nullable ToString()

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 das:

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

Ist das richtig (die kürzere Version) oder habe ich etwas übersehen?

119voto

Tomas Vana Punkte 17297

Sie haben völlig recht. Auch in diese Frage wird die erste Lösung vorgeschlagen, ohne dass es jemandem wirklich auffällt. ToString() gibt bereits die richtige Antwort.

Vielleicht ist das Argument für die ausführliche Lösung die Lesbarkeit: Wenn Sie ToString() auf etwas, das angeblich zu sein null Sie normalerweise erwarten a NullReferenceException obwohl er hier nicht geworfen wird.

14voto

Andrew Bezzub Punkte 15286

Ich denke, dass viele Menschen solche Prüfungen haben, weil es kein natürliches Verhalten eines Objekts ist, das einen Nullwert halten kann.

5voto

Paul Punkte 34419

Nein, Sie haben Recht, die kürzere Version ist die gleiche wie die, die andere Leute in dieser Hinsicht gemacht haben. Das andere Konstrukt, das ich häufig anstelle des ternären Operators mit nullables verwende, ist der Null-Koaleszenz-Operator, der Sie auch vor nulls schützt. Für ToString() ist er nicht notwendig (wie Sie schon sagten), aber für Standard-Int-Werte (zum Beispiel) funktioniert er sehr gut, z.B.:

int page = currentPage ?? 1;

die Sie alle Ganzzahloperationen auf Seite ohne erste explizite Nullprüfung und Aufruf für den Wert in currentPage (wo currentPage ist ein int? vielleicht als Parameter übergeben) tun können

5voto

outis nihil Punkte 738

Ich weiß, lange nachdem es relevant war, aber ... Ich vermute, es ist, weil für nullable Typen wie int? die .ToString()-Methode nicht zulässt, dass Sie Format-Strings verwenden. Siehe Wie kann ich ein nullbares DateTime mit ToString() formatieren? . Vielleicht gab es im ursprünglichen Code eine Formatzeichenkette in .ToString(), oder der Programmierer vergaß, dass .ToString() ohne Formatzeichenkette bei nullbaren Typen noch verfügbar war.

3voto

Andrey Punkte 57704

Vielleicht geht es nur darum, einem Muster zu folgen? Oder sie kennen sich mit dem Backend nicht aus. Sie haben Recht, dass der Code genau derselbe ist. Sie können es sogar tun:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X