Hier ist das Szenario ...
if (entry.Properties["something"].Value != null)
attribs.something = entry.Properties["something"].Value.ToString();
Obwohl effektiv und korrekt funktioniert, sieht das für mich hässlich aus. Wenn ich vor dem Ausführen des ToString () nicht auf eine Null prüfe, wird eine Ausnahme ausgelöst, wenn die Eigenschaft Null war. Gibt es einen besseren Weg, mit diesem Szenario umzugehen?
Sehr geschätzt!
Update 8 Jahre später (wow!), Um den nullbedingten Operator von c # 6 abzudecken :
var value = maybeNull?.ToString() ?? ""
Andere Ansätze:
object defaultValue = "default";
attribs.something = (entry.Properties["something"].Value ?? defaultValue).ToString()
Ich habe auch das verwendet, was nicht besonders schlau aber bequem ist:
public static string ToSafeString(this object obj)
{
return (obj ?? string.Empty).ToString();
}
Wenn Sie sich auf .NET Framework 3.5 konzentrieren, 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();
Convert.ToString(entry.Properties["something"].Value);
Das Hinzufügen eines leeren Strings zu einem Objekt ist eine verbreitete Redewendung, mit der Sie eine nullsichere ToString
-Konvertierung durchführen können, z.
attribs.something = ""+entry.Properties["something"].Value;
Wenn entry.Properties["something"].Value
null
ist, wird eine leere string
zurückgegeben.
Edit: Beginnend mit C # 6 können Sie den ?.
-Operator verwenden, um die null
-Prüfung noch einfacher zu vermeiden:
attribs.something = entry.Properties["something"].Value?.ToString();
// ^^
Kannst du nicht:
attribs.something = entry.Properties["something"].Value as string;
attribs.something = String.Format("{0}", entry.Properties["something"].Value);
Nicht sicher über die Leistung ...
Ist es irgendwie möglich, etwas wie Dale Ragans Antwort oben 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;
}
}
attribs.something = string.Format("{0}",entry.Properties["something"].Value)
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 new nullbedingter Operator .
Als Variante zur Antwort von RexM:
attribs.something = (entry.Properties["something"].Value ?? attribs.something).ToString()
Der einzige Nachteil wäre, dass den Attributen etwas zugewiesen würde (in diesem Beispiel selbst), selbst wenn entry.Properties ["Etwas"]. Value war null - was teuer werden könnte, wenn die .something-Eigenschaft eine andere Verarbeitung ausführt und/oder diese Zeile führt viel aus (wie in einer Schleife).
Um genau das zu tun, was Sie versuchen, eine Hilfsmethode auszuführen, kann immer verwendet werden:
CopyIfNotNull(entry.Properties["something"].Value, out attribs.something);
void CopyIfNotNull(string src, out string dest)
{
if(src != null)
dest = src;
}
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 null
ist.)