Ich liebe den Null-Koaleszenz-Operator, weil er es einfach macht, einen Standardwert für nullfähige Typen zuzuweisen.
int y = x ?? -1;
Das ist großartig, außer wenn ich etwas Einfaches tun muss x
. Wenn ich zum Beispiel nachsehen möchte, Session
muss ich normalerweise etwas ausführlicheres schreiben.
Ich wünschte, ich könnte das tun:
string y = Session["key"].ToString() ?? "none";
Dies ist jedoch nicht möglich, da der .ToString()
Aufruf vor der Nullprüfung erfolgt und daher fehlschlägt, wenn er Session["key"]
null ist. Am Ende mache ich das:
string y = Session["key"] == null ? "none" : Session["key"].ToString();
Es funktioniert und ist meiner Meinung nach besser als die dreizeilige Alternative:
string y = "none";
if (Session["key"] != null)
y = Session["key"].ToString();
Auch wenn das funktioniert, bin ich immer noch gespannt, ob es einen besseren Weg gibt. Es scheint egal, worauf ich mich immer Session["key"]
zweimal beziehen muss ; einmal für die Prüfung und noch einmal für die Zuordnung. Irgendwelche Ideen?
.?
) wie Groovy .Antworten:
Wie wäre es mit
quelle
.ToStringOrDefault()
ist meine bevorzugte Methode. Ich verwende diese Antwort jedoch innerhalb von Jons Erweiterungsmethode;)Wenn Sie dies häufig speziell mit
ToString()
tun, können Sie eine Erweiterungsmethode schreiben:Oder natürlich eine Standardmethode:
quelle
.ToStringOrDefault()
ist einfach und elegant. Eine schöne Lösung.object
sind ein Fluch und machen eine Codebasis kaputt, und Erweiterungsmethoden, die fehlerfrei mit Nullwerten arbeitenthis
, sind absolut böse.Sie können auch verwenden
as
, was ergibt,null
wenn die Konvertierung fehlschlägt:Dies würde zurückkehren ,
"none"
selbst wenn jemand einen ausgestopftenint
inSession["key"]
.quelle
ToString()
.ToString()
konvertiert ein Objekt, das eine Zeichenfolge enthält, in eine Zeichenfolge. Sie können dasselbe mitobj as string
oder tun(string)obj
. Es ist eine ziemlich häufige Situation in ASP.NET.ToString()
ein Objekt (nämlichSession["key"]
) auf, dessen Typ er nicht erwähnt hat. Es kann sich um jede Art von Objekt handeln, nicht unbedingt um eine Zeichenfolge.Wenn es immer ein sein wird
string
, kannst du Folgendes besetzen:Dies hat den Vorteil, sich zu beschweren, anstatt den Fehler zu verbergen, wenn jemand einen
int
oder etwas hineinstecktSession["key"]
. ;)quelle
Alle vorgeschlagenen Lösungen sind gut und beantworten die Frage. das ist also nur um es etwas zu verlängern. Derzeit befassen sich die meisten Antworten nur mit Nullvalidierung und Zeichenfolgentypen. Sie können das
StateBag
Objekt um eine generischeGetValueOrDefault
Methode erweitern, ähnlich der Antwort von Jon Skeet.Eine einfache generische Erweiterungsmethode, die eine Zeichenfolge als Schlüssel akzeptiert und dann vom Typ das Sitzungsobjekt überprüft. Wenn das Objekt null oder nicht vom gleichen Typ ist, wird der Standardwert zurückgegeben, andernfalls wird der Sitzungswert stark typisiert zurückgegeben.
Etwas wie das
quelle
HttpSessionState
.T value = source[key] as T; return value ?? defaultValue;
HttpSessionState
für die Sitzung verlängern. :)Wir verwenden eine Methode namens
NullOr
.Verwendung
Quelle
quelle
Dot
, fanden es aber zu unbeschreiblich. Wir haben uns fürNullOr
einen guten Kompromiss zwischen Selbsterklärung und Kürze entschieden. Wenn Ihnen die Benennung überhaupt nicht wichtig war, können Sie sie jederzeit anrufen_
. Wenn Sie die Lambdas zu umständlich zum Schreiben finden, können Sie dafür einen Ausschnitt verwenden, aber ich persönlich finde es ziemlich einfach genug. Was? :
können Sie nicht verwenden , die mit komplexeren Ausdrücken, würden Sie sie zu einem neuen lokalen bewegen müssen;NullOr
ermöglicht es Ihnen, dies zu vermeiden.Ich würde es vorziehen, eine sichere Umwandlung für eine Zeichenfolge zu verwenden, falls das mit dem Schlüssel gespeicherte Objekt keine ist. Die Verwendung führt
ToString()
möglicherweise nicht zu den gewünschten Ergebnissen.Wie @Jon Skeet sagt, wenn Sie dies häufig tun, handelt es sich um eine Erweiterungsmethode oder besser noch um eine Erweiterungsmethode in Verbindung mit einer stark typisierten SessionWrapper-Klasse. Auch ohne die Erweiterungsmethode ist der stark typisierte Wrapper möglicherweise eine gute Idee.
Benutzt als
quelle
Erstellen Sie eine Hilfsfunktion
quelle
Skeets Antwort ist die beste - insbesondere finde ich, dass seine
ToStringOrNull()
ziemlich elegant ist und am besten zu Ihren Bedürfnissen passt. Ich wollte der Liste der Erweiterungsmethoden eine weitere Option hinzufügen:Rückgabe des ursprünglichen Objekts oder des Standardzeichenfolgenwerts für null :
Verwenden Sie diesen
var
Wert für den zurückgegebenen Wert, da er nur als Standardzeichenfolge zurückgegeben wird, wennnull
quelle
null
defaultValue
wenn sie nicht benötigt wirdinput != null
?input != null
Auswertung gibt das Objekt als sich selbst zurück.input == null
Gibt die als Parameter angegebene Zeichenfolge zurück. Daher ist es möglich, dass eine Person aufruft.OnNullAsString(null)
- aber der Zweck (wenn auch selten nützliche Erweiterungsmethode) bestand darin, sicherzustellen, dass Sie entweder das Objekt oder die Standardzeichenfolgeinput!=null
Szenario gibt die Eingabe nur zurück, wenn diesdefaultValue!=null
auch gilt. sonst wird es ein werfenArgumentNullException
.Dies ist mein kleiner typsicherer "Elvis-Operator" für Versionen von .NET, die nicht unterstützen?
Das erste Argument ist das getestete Objekt. Zweitens ist die Funktion. Und drittens ist der Nullwert. Also für Ihren Fall:
Dies ist auch für nullfähige Typen sehr nützlich. Beispielsweise:
quelle