24 Stimmen

Convert.ToInt32(String) auf String.Empty vs. Null

Der Ausdruck Convert.ToInt32(String.Empty) wird eine FormatException auslösen, weil er einen leeren String nicht in einen Int32-Wert umwandeln kann.

Der Ausdruck Convert.ToInt32(DirectCast(Nothing, String)) in VB.NET oder Convert.ToInt32((string)null) in C# wird jedoch das Null in einen Int32-Wert von Null umwandeln.

Wenn ich den .NET-Quellcode in Convert.cs untersuche, sehe ich den folgenden Code:

public static int ToInt32(String value) {
    if (value == null) 
        return 0;
    return Int32.Parse(value, CultureInfo.CurrentCulture);
}

Dies erklärt das Verhalten, aber ich möchte verstehen, warum es auf diese Weise geschrieben wurde, anstatt auch für einen leeren String Null zurückzugeben?

Zum Beispiel, warum wurde es nicht so geschrieben:

public static int ToInt32(String value) {
    if (String.IsNullOrEmpty(value)) 
        return 0;
    return Int32.Parse(value, CultureInfo.CurrentCulture);
}

(Beachten Sie, dass String.IsNullOrEmpty() und Convert.ToInt32() beide auf .NET 2.0 zurückgehen, möglicherweise noch früher.)

Bearbeiten: Meine Frage ähnelt sehr dieser Frage, aber ich möchte auch wissen, warum Convert.ToInt32(String.Empty) eine Ausnahme auslöst, anstatt den Int32-Standardwert von 0 zurückzugeben. (Die Antwort ist, dass String.Empty nicht der Standardwert von String ist, daher gibt es keine Korrelation.)

10voto

Honza Brestan Punkte 10557

Ich habe absolut keinen Einblick in das tatsächliche Denken des Design-Teams hinter diesem, aber mir scheint, dass es sich um eine Art "Standardwert-Äquivalenz" handeln könnte. Null ist der Standardwert von string, daher erscheint es logisch, es in einen Standardwert von int umzuwandeln. String.Empty ist jedoch ein String wie jeder andere nicht-null-String-Daten, daher wird erwartet, dass er formatiert wird, daher die Ausnahme.

Ich denke, dass ArgumentNullException eine "sauberere" Entscheidung gewesen wäre, aber ich weiß nicht, welche internen Probleme dahinter stecken könnten...

Weitere Bearbeitung:
Dort, direkt in der MSDN-Dokumentation, eine der 5 möglichen Ergebnisse:

Eine erfolgreiche Konvertierung. Für Konvertierungen zwischen zwei verschiedenen Basistypen, die nicht in den vorherigen Ergebnissen aufgeführt sind, werden alle Erweiterungskonvertierungen sowie alle Verengungskonvertierungen, die nicht zu einem Datenverlust führen, erfolgreich sein und die Methode wird einen Wert des Zielbasistyps zurückgeben.

Es scheint, dass die Konvertierung von einem null-Objekt in einen anderen Typ keinen Grund hat zu scheitern (kein Formatfehler, keine nicht unterstützte Typ-Konvertierung), aber ein Werttyp wie int hat keine Darstellung von "keinen Daten", daher wird ein Standardwert des Zieltyps produziert.

Ein schneller Gedanke - die "gegenläufige" Konvertierung, Convert.ToString(0), liefert kein null zurück, denn:

  • 0 ist Daten, es kann in vielen Fällen ein sehr gültiger und wichtiger Wert sein
  • null ist keine korrekte Zeichenfolgendarstellung von 0

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