wake-up-neo.com

Überprüfen auf null vor ToString ()

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!

74
Dscoduc

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();
}
118
Rex M

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();
41
Dale Ragan
Convert.ToString(entry.Properties["something"].Value);
38
Vahid

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"].Valuenull 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();
//                                                     ^^
3
dasblinkenlight

Kannst du nicht:

attribs.something = entry.Properties["something"].Value as string;
2
NotDan
attribs.something = String.Format("{0}", entry.Properties["something"].Value);

Nicht sicher über die Leistung ...

2
user645280

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;
    }
}
1
Dave the Rave
attribs.something  = string.Format("{0}",entry.Properties["something"].Value)
1
aljj

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 .

1
ZuoLi

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).

1
PhilChuang

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;
}
1
Mike Hall

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.)

0
Zach Scrivena