Hier ist das Szenario ...
if (entry.Properties["something"].Value != null)
attribs.something = entry.Properties["something"].Value.ToString();
Während es effektiv ist und richtig funktioniert, sieht es für mich hässlich aus. Wenn ich vor dem Ausführen von ToString () nicht nach einer Null suche, wird eine Ausnahme ausgelöst, wenn die Eigenschaft null war. Gibt es eine bessere Möglichkeit, mit diesem Szenario umzugehen?
Sehr geschätzt!
c#
.net
string
properties
Dscoduc
quelle
quelle
Antworten:
Update 8 Jahre später (wow!), Um den nullbedingten Operator von c # 6 abzudecken :
var value = maybeNull?.ToString() ?? String.Empty;
Andere Ansätze:
object defaultValue = "default"; attribs.something = (entry.Properties["something"].Value ?? defaultValue).ToString()
Ich habe auch dies verwendet, was nicht besonders klug, aber praktisch ist:
public static string ToSafeString(this object obj) { return (obj ?? string.Empty).ToString(); }
quelle
Wenn Sie auf .NET Framework 3.5 abzielen, ist meiner Meinung nach die eleganteste Lösung eine Erweiterungsmethode.
public static class ObjectExtensions { public static string NullSafeToString(this object obj) { return obj != null ? obj.ToString() : String.Empty; } }
Dann zu verwenden:
attribs.something = entry.Properties["something"].Value.NullSafeToString();
quelle
Convert.ToString(entry.Properties["something"].Value);
quelle
Das Hinzufügen einer leeren Zeichenfolge zu einem Objekt ist eine gängige Redewendung, mit der Sie eine null-sichere
ToString
Konvertierung wie folgt durchführen können:attribs.something = ""+entry.Properties["something"].Value;
Wann
entry.Properties["something"].Value
istnull
, gibt dies leise ein leeres zurückstring
.Bearbeiten: Ab C # 6 können Sie den
?.
Operator verwenden, umnull
eine noch einfachere Überprüfung zu vermeiden :attribs.something = entry.Properties["something"].Value?.ToString(); // ^^
quelle
Kannst du nicht tun:
attribs.something = entry.Properties["something"].Value as string;
quelle
attribs.something = String.Format("{0}", entry.Properties["something"].Value);
Ich bin mir jedoch nicht sicher über die Leistung ...
quelle
In C # 6.0 können Sie dies auf sehr elegante Weise tun:
attribs.something = entry.Properties["something"].Value?.ToString();
Und hier ist ein Artikel über den neuen nullbedingten Operator .
quelle
Als Variation der Antwort von RexM:
attribs.something = (entry.Properties["something"].Value ?? attribs.something).ToString()
Der einzige Nachteil wäre, dass den Attributen etwas zugewiesen wird (in diesem Beispiel selbst), selbst wenn entry.Properties ["etwas"]. Der Wert war null - was teuer sein könnte, wenn die Eigenschaft .something eine andere Verarbeitung ausführt und / oder diese Zeile führt viel aus (wie in einer Schleife).
quelle
Um genau das zu tun, was Sie versuchen, kann immer eine Hilfsmethode verwendet werden:
CopyIfNotNull(entry.Properties["something"].Value, out attribs.something); void CopyIfNotNull(string src, out string dest) { if(src != null) dest = src; }
quelle
Ist es irgendwie möglich, etwas wie die obige Antwort von Dale Ragan zu tun , aber ToString () zu überschreiben, anstatt eine neue NullSafeToString () -Methode zu erstellen? Ich möchte, dass dies (oder die Rückgabe von "null") das Standardverhalten ist. Der Compiler (Visual C # 2010 Express) beschwert sich nicht, wenn ich der öffentlichen statischen Klasse ObjectExtensions die folgende Methode hinzufüge, aber die Methode wird nicht aufgerufen ...
public static String ToString(this Object obj) { if (obj == null) { return "null"; } else { return obj.GetType().Name; } }
quelle
attribs.something = string.Format("{0}",entry.Properties["something"].Value)
quelle
Wie wäre es mit einer Hilfsmethode wie dieser:
attribs.something = getString( entry.Properties["something"].Value, attribs.something); static String getString( Object obj, String defaultString) { if (obj == null) return defaultString; return obj.ToString(); }
Alternativ können Sie den
??
Operator verwenden:attribs.something = (entry.Properties["something"].Value ?? attribs.something).ToString();
(Beachten Sie den redundanten
ToString()
Aufruf, wenn der Wert istnull
)quelle