Gibt es eine einfache Möglichkeit, Folgendes 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 ordnungsgemäße Überladung dafür hätte.
Convert.ToString()
macht genau das erste, was Sie darunter geschrieben haben.Antworten:
C # 6.0 Bearbeiten:
Mit C # 6.0 können wir jetzt eine prägnante, gussfreie Version der Originalmethode haben:
Oder sogar mit Interpolation:
Ursprüngliche Antwort:
oder
noch prägnanter sein.
Wie bereits erwähnt, benötigen Sie leider häufig eine Besetzung auf beiden Seiten, damit dies mit Nicht-String- oder Objekttypen funktioniert:
Daher ist die Besetzung, obwohl sie vielleicht elegant erscheint, fast immer notwendig und in der Praxis nicht so prägnant.
Wie an anderer Stelle vorgeschlagen, empfehle ich möglicherweise die Verwendung einer Erweiterungsmethode, um dies sauberer zu machen:
quelle
string.Format formatiert null als leere Zeichenfolge und ruft ToString () für Nicht-Null-Objekte auf. So wie ich es verstehe, haben Sie danach gesucht.
quelle
"" + myObj
. Aber ich habe gelesen, dass zusätzliche Zeichenfolgen erstellt werden.str.Concat(myObj)
scheint gut zu funktionieren und ist "noch schneller".Es gibt ein
Convert.ToString(Object value)
.Net 2.0 (ca. 5 Jahre bevor dieses Q gefragt wurde), das genau das zu tun scheint, was Sie wollen:http://msdn.microsoft.com/en-us/library/astxcyeh(v=vs.80).aspx
Vermisse / interpretiere ich hier etwas wirklich Offensichtliches?
quelle
Mit einer Erweiterungsmethode können Sie Folgendes erreichen:
Folgendes würde nichts auf den Bildschirm schreiben und keine Ausnahme auslösen:
quelle
string s = "" + myObj;
hackisch hält, sollte der Aufruf einer Funktion für ein Nullobjekt in dasselbe Boot fallen. Ich würde dies ablehnen, aber es löst das vorliegende Problem, ich bin nur nicht einverstanden mit der Verwendung. Null-Objekte solltenNullReferenceException
auch in Erweiterungsmethoden ausgelöst werden.ToStringOrEmptyWhenNull
.this
Parameter), da es sich nur um syntaktischen Zucker handelt. Das heißtx.SomeExtensionMethod()
ist syntaktischer Zucker fürSomeStaticClass.SomeExtensionMethod(x);
Wenn alsox
wirdnull
man kein Verfahren auf einem versucht aufzurufennull
Objekt , sondern ein vorübergehendesnull
Objekt zu einer statischen Methode. Wenn und nur wenn diese Methode nach einemnull
Parameter sucht und bei Auftreten eines solchen auslöst, wird eine Erweiterungsmethode für einen Objektwurf "aufgerufen"null
.Ich bin damit nicht einverstanden:
ist in keiner Weise ein Hack. Ich denke, es ist ein gutes Beispiel für klaren Code. Es ist absolut offensichtlich, was Sie erreichen möchten und dass Sie null erwarten.
AKTUALISIEREN:
Ich sehe jetzt, dass Sie nicht gesagt haben, dass dies ein Hack war. Aber es ist in der Frage impliziert, dass Sie denken, dass dieser Weg nicht der richtige ist. In meinen Augen ist es definitiv die klarste Lösung.
quelle
Ich denke, dies wäre der kürzeste Weg und hätte auch einen vernachlässigbaren Leistungsaufwand. Denken Sie daran, dass es für den Leser des Codes nicht ganz klar ist, was die Absicht ist.
quelle
Concat
tatsächlich eine Nullprüfung darunter und gibt zurückstring.Empty
oderarg0.ToString()
, was etwas performanter zu sein scheint (ich meine, wir reden hier über ms).Eigentlich habe ich nicht verstanden, was du machen willst. Soweit ich weiß, können Sie diesen Code auch so schreiben. Fragen Sie das oder nicht? Kannst du mehr erklären?
quelle
string s = string.IsNullOrEmpty(myObj) ? string.Empty : myObj.ToString();
Ich könnte für meine Antwort verprügelt werden, aber hier geht es trotzdem:
Ich würde einfach schreiben
Zeichenfolge s = "" if (myObj! = null) {x = myObj.toString (); }}
Gibt es eine Leistungsauszahlung für die Verwendung des ternären Operators? Ich weiß es nicht genau.
Und natürlich können Sie, wie oben erwähnt, dieses Verhalten in eine Methode wie safeString (myObj) einfügen, die die Wiederverwendung ermöglicht.
quelle
Ich hatte das gleiche Problem und löste es, indem ich das Objekt einfach in einen String umwandelte. Dies funktioniert auch für Nullobjekte, da Zeichenfolgen Nullen sein können. Sofern Sie absolut keine Nullzeichenfolge haben möchten, sollte dies einwandfrei funktionieren:
quelle
Einige (Geschwindigkeits-) Leistungstests, die die verschiedenen Optionen zusammenfassen, nicht dass es wirklich darauf ankommt #Mikrooptimierung (unter Verwendung einer Linqpad-Erweiterung )
Optionen
Es ist wahrscheinlich wichtig darauf hinzuweisen, dass
Convert.ToString(...)
eine Nullzeichenfolge beibehalten wird.Ergebnisse
Objekt
String
quelle
Holstebroes Kommentar wäre Ihre beste Antwort:
Wenn
myObj
null ist, platziert Format dort einen Wert für eine leere Zeichenfolge.Es erfüllt auch Ihre einzeiligen Anforderungen und ist leicht zu lesen.
quelle
Obwohl dies eine alte Frage ist und das OP nach C # gefragt hat, möchte ich eine VB.Net-Lösung für diejenigen freigeben, die eher mit VB.Net als mit C # arbeiten:
Leider lässt VB.Net den? -Operator nach einer Variablen nicht zu, sodass myObj? .ToString nicht gültig ist (zumindest nicht in .Net 4.5, das ich zum Testen der Lösung verwendet habe). Stattdessen verwende ich das If, um eine leere Zeichenfolge zurückzugeben, falls myObj nichts ist. Der erste Tostring-Aufruf gibt also eine leere Zeichenfolge zurück, während der zweite (wobei myObj nicht Nothing ist) "42" zurückgibt.
quelle