126 Stimmen

Wie führt man ToString für ein möglicherweise null-Objekt aus?

Gibt es einen einfachen Weg, um das Folgende zu tun:

String s = myObj == null ? "" : myObj.ToString();

Ich weiß, dass ich Folgendes tun kann, aber ich betrachte es wirklich als Hack:

String s = "" + myObj;

Es wäre großartig, wenn Convert.ToString() eine ordentliche Überladung dafür hätte.

3 Stimmen

Ich sehe nichts falsch am ersten. Wenn du den zweiten als Hack betrachtest, ist es am besten, einfach eine Hilfsfunktion zu schreiben, die die Nullprüfung durchführt.

0 Stimmen

Bitte sei genauer mit deiner Frage.

3 Stimmen

String.Format("{0}", myObj) akzeptiert Nullwerte.

229voto

Andrew Hanlon Punkte 7046

C# 6.0 Bearbeiten:

Mit C# 6.0 können wir jetzt eine prägnante, castfreie Version der Ursprungsmethode haben:

string s = myObj?.ToString() ?? "";

Oder sogar mit Interpolation:

string s = $"{myObj}";

Ursprüngliche Antwort:

string s = (myObj ?? String.Empty).ToString();

oder

string s = (myObjc ?? "").ToString()

um noch prägnanter zu sein.

Leider, wie bereits erwähnt wurde, benötigen Sie oft auf beiden Seiten einen Cast, damit dies auch mit Nicht-String- oder Object-Typen funktioniert:

string s = (myObjc ?? (Object)"").ToString()
string s = ((Object)myObjc ?? "").ToString()

Daher ist, obwohl es elegant erscheinen mag, der Cast fast immer erforderlich und ist in der Praxis nicht so prägnant.

Wie an anderer Stelle vorgeschlagen, empfehle ich möglicherweise die Verwendung einer Erweiterungsmethode, um dies sauberer zu gestalten:

public static string ToStringNullSafe(this object value)
{
    return (value ?? string.Empty).ToString();
}

0 Stimmen

Wird das kompilieren? Überprüft der Coalescing-Operator nicht Typen?

1 Stimmen

Es funktioniert, da (object??string) ein Objekt zurückgibt, da Coalesce den kleinsten gemeinsamen Typ verwendet. Aber ich denke, dass dies für Schnittstellen nicht funktioniert, weil es nicht entscheiden kann, welche Schnittstelle ausgewählt werden soll (da pro Klasse mehrere Schnittstellen erlaubt sind).

4 Stimmen

Niedriger Bewertung als dieses Objekt gegossen ist schrecklich hässlich und beinhaltet Boxen.

43voto

Holstebroe Punkte 4803
string.Format("{0}", myObj);

string.Format wird null als leeren String formatieren und ToString() für nicht-null-Objekte aufrufen. So wie ich es verstehe, ist das, was du gesucht hast.

3 Stimmen

Ich persönlich mag das nicht. Der Code ist möglicherweise unbedeutend kürzer als String s = myObj == null ? "" : myObj.ToString(), aber du verbirgst völlig die Begründung hinter deiner Methode.

0 Stimmen

Angenommen, dies ist Mikro-Optimierung, aber es dauert etwa 5x länger als einfach "" + myObj. Aber ich habe gelesen, dass dadurch zusätzliche Zeichenfolgen erstellt werden. str.Concat(myObj) scheint genauso gut zu funktionieren und ist "sogar schneller".

25voto

Rob Gilliam Punkte 2294

Es wäre toll, wenn Convert.ToString() eine geeignete Überladung für dies hätte.

Es gibt ein Convert.ToString(Object value) seit .Net 2.0 (ca. 5 Jahre bevor diese Frage gestellt wurde), das anscheinend genau das tut, was du willst:

http://msdn.microsoft.com/en-us/library/astxcyeh(v=vs.80).aspx

Verpasse ich hier etwas wirklich Offensichtliches?

3 Stimmen

Du nicht, sie tun. Warum einfach, wenn es kompliziert sein kann :)

16voto

Pieter van Ginkel Punkte 28696

Mit einer Erweiterungsmethode können Sie dies erreichen:

public static class Extension
{
    public static string ToStringOrEmpty(this Object value)
    {
        return value == null ? "" : value.ToString();
    }
}

Der folgende Code würde nichts auf den Bildschirm schreiben und keine Ausnahme auslösen:

        string value = null;

        Console.WriteLine(value.ToStringOrEmpty());

0 Stimmen

Führen Erweiterungsmethodenaufrufe die übliche Überprüfung auf Null aus...?

0 Stimmen

Nun, hier überprüfe ich innerhalb der Erweiterungsmethode auf Null. Das Beispiel läuft ohne Ausnahme.

0 Stimmen

Ich denke nicht, dass es etwas gibt, das noch mehr "hackish" ist als das. Sie haben eine Situation geschaffen, in der es völlig legal ist, eine Funktion auf einem Null-Objekt aufzurufen... Dies ist besser implementiert als eine Nicht-Erweiterungs-Dienstprogrammfunktion.

8voto

steinar Punkte 9140

Ich bin anderer Meinung:

String s = myObj == null ? "" : myObj.ToString();

ist in keiner Weise ein Hack. Ich denke, es ist ein gutes Beispiel für sauberen Code. Es ist absolut offensichtlich, was du erreichen möchtest und dass du null erwartest.

UPDATE:

Ich sehe jetzt, dass du nicht gesagt hast, dass dies ein Hack war. Aber in der Frage wird impliziert, dass du denkst, dass dies nicht der richtige Weg ist. Meiner Meinung nach ist es definitiv die klarste Lösung.

0 Stimmen

Er hat nicht gesagt, dass diese Methode gehackt wurde. Tatsächlich hat er nicht gesagt, was daran falsch war, außer vielleicht anzudeuten, dass es nicht einfach war. Ich denke nicht, dass etwas an dieser Methode falsch ist. +1, weil ich es auf diese Weise machen würde.

0 Stimmen

Ich stimme OP zu... es gibt bereits einen Null-Coalescing-Operator in c# - siehe meinen Beitrag unten.

0 Stimmen

Ich finde, dass der Null-Koaleszenzoperator in diesem Fall etwas weniger klar ist, aber ich wäre genauso zufrieden, das zu verwenden.

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