Vor ToString () auf Null prüfen


76

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!


Was sollte die Ausgabe also sein, wenn der Wert null ist?
Zach Scrivena

Es würde den Standardwert verwenden, der attribs.something zugewiesen wurde
Dscoduc

@dscoduc Ich suche nach deinen HTA jQuery-Informationen aus dem Jahr 2009. Gibt es das noch? Ihr Blog und Ihre Website scheinen offline zu sein.
Yzorg


2
Meine Frage war aus dem Jahr 2009 und die eine, auf die Sie verwiesen haben, stammt aus dem Jahr 2010 ... also ist die andere ein Duplikat von mir, nein?
Dscoduc

Antworten:


128

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

1
Wissen Sie sofort, ob der "Standard" durch string.Empty ersetzt werden könnte?
Dscoduc

+1 und Antwort: Habe es gerade getestet und perfekt funktioniert ... Danke!
Dscoduc

Beachten Sie, dass Sie bei einem nachfolgenden Anruf möglicherweise gültige Daten überschreiben, wenn die Methode, mit der der Anruf getätigt wird, mehrmals ausgeführt wird und Attribute erneut verwendet werden.
xcud

@xcud: Richtig. In diesem Fall sollte er den folgenden Code verwenden: attribs.something = (entry.Properties ["etwas"]. Value ?? (objcet) attribs.something) .ToString ();
Konfigurator

42

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();

Schön. Ich stehe gerade vor einer Konvertierung von 1.1 auf 4.0 und in 1.1 hat null.ToString () tatsächlich "" zurückgegeben, sodass ich jetzt ein paar tausend Vorkommen habe, um die Nullsicherheit zu überprüfen. Wenn ich das zum Laufen bringe, wird der Übergang so viel reibungsloser!
Nicolas78

Wow, hat mir das jemals viel Zeit gespart? Vielen Dank!
Brad

39
Convert.ToString(entry.Properties["something"].Value);

40-Love - nein, dies gibt null zurück, keine leere Zeichenfolge, wenn der Wert null ist.
Chris Peacock

@ChrisPeacock nein, überprüfen Sie die Dokumentation: Der zurückgegebene Wert von Convert.ToString (Objektwert) ist "Die String-Darstellung des Werts von 'value' oder String.Empty, wenn value ein Null ist". Ein schneller Check in einem aktuellen Programm bestätigt dies.
Rob Gilliam

3

Das Hinzufügen einer leeren Zeichenfolge zu einem Objekt ist eine gängige Redewendung, mit der Sie eine null-sichere ToStringKonvertierung wie folgt durchführen können:

attribs.something = ""+entry.Properties["something"].Value;

Wann entry.Properties["something"].Valueist null, gibt dies leise ein leeres zurück string.

Bearbeiten: Ab C # 6 können Sie den ?.Operator verwenden, um nulleine noch einfachere Überprüfung zu vermeiden :

attribs.something = entry.Properties["something"].Value?.ToString();
//                                                     ^^

Dies ist knapper als der seltsame Aufruf von Convert.ToString.
Thepaulpage

@ thepaulpage Es gibt einen noch besseren Weg in C # 6.
Sergey Kalinichenko

2

Kannst du nicht tun:

attribs.something = entry.Properties["something"].Value as string;

Nein, das kannst du nicht. Wenn es 'null' ist, erhalten Sie einen Null-Referenzfehler.
George Stocker

1
Dies funktioniert, da bei einem Wert von null eine Nullzeichenfolge zurückgegeben wird und keine Ausnahme ausgelöst wird.
Live-Liebe

2
Dies funktioniert nicht für Werttypen. 'string str = myFloat als string;' schlägt fehl. Sie erhalten den folgenden Compilerfehler. Der Typ 'float' kann nicht über eine Referenzkonvertierung, Boxkonvertierung, Unboxingkonvertierung, Wrappingkonvertierung oder Nulltypkonvertierung in 'string' konvertiert werden
CleanCoder

1
Nein, wenn der Typ nicht string ist, wird immer null zurückgegeben !!! Das ist Casting und keine Bekehrung! und funktioniert nicht Formularwerttypen!
Sawan

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

Ich bin mir jedoch nicht sicher über die Leistung ...


2

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 .


1

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


1

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;
}

Müssen Sie im zweiten Argument von CopyIfNotNull nicht "out" angeben?
Dscoduc

Jep. Das wurde mir klar, nachdem ich es gepostet hatte.
Mike Hall

1

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;
    }
}

2
Sicher, da Instanzmethoden eine höhere Priorität haben als Erweiterungsmethoden
Codymanix

1
attribs.something  = string.Format("{0}",entry.Properties["something"].Value)

0

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 ist null)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.