web-dev-qa-db-fra.com

Recherche de null avant ToString ()

Voici le scénario ... 

if (entry.Properties["something"].Value != null)
  attribs.something = entry.Properties["something"].Value.ToString();

Bien que efficace et fonctionnant correctement, cela me semble moche. Si je ne vérifie pas la valeur NULL avant d'exécuter ToString (), une exception est levée si la propriété était null. Existe-t-il une meilleure façon de gérer ce scénario?

Très appréciée!

74
Dscoduc

Mise à jour 8 ans plus tard (wow!) Pour couvrir l'opérateur null-conditionnel de c # 6 :

var value = maybeNull?.ToString() ?? ""

Autres approches:

object defaultValue = "default";
attribs.something = (entry.Properties["something"].Value ?? defaultValue).ToString()

J'ai aussi utilisé cela, ce qui n'est pas terriblement intelligent, mais pratique:

public static string ToSafeString(this object obj)
{
    return (obj ?? string.Empty).ToString();
}
118
Rex M

Si vous ciblez le .NET Framework 3.5, la solution la plus élégante serait une méthode d'extension à mon avis.

public static class ObjectExtensions
{
    public static string NullSafeToString(this object obj)
    {
        return obj != null ? obj.ToString() : String.Empty;
    }
}

Puis utiliser:

attribs.something = entry.Properties["something"].Value.NullSafeToString();
41
Dale Ragan
Convert.ToString(entry.Properties["something"].Value);
38
Vahid

L'ajout d'une chaîne vide à un objet est un idiome courant qui vous permet d'effectuer une conversion ToString null-safe, comme ceci:

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

Lorsque entry.Properties["something"].Value est null, ceci renvoie silencieusement une string vide.

Edit: À partir de C # 6, vous pouvez utiliser l'opérateur ?. pour éviter la vérification null d'une manière encore plus simple:

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

Ne pouvez-vous pas faire:

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

Pas sûr de la performance cependant ...

2
user645280

Est-il possible en quelque sorte de faire quelque chose comme La réponse de Dale Ragan ci-dessus , mais en substituant ToString () au lieu de créer une nouvelle méthode NullSafeToString ()? J'aimerais que cela (ou renvoie "null") soit le comportement par défaut. Le compilateur (Visual C # 2010 Express) ne se plaint pas lorsque j'ajoute la méthode suivante à la classe statique publique ObjectExtensions, mais la méthode n'est pas appelée ...

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

En variante à la réponse de RexM:

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

Le seul inconvénient serait que quelque chose soit attribué à quelque chose d'attribut (lui-même, dans cet exemple) même si entry.Properties ["quelque chose"]. La valeur était nulle - ce qui pourrait coûter cher si la propriété .something effectuait un autre traitement et/ou cette ligne s'exécute beaucoup (comme dans une boucle).

1
PhilChuang

Pour faire précisément ce que vous essayez de faire, une méthode d'assistance peut toujours être utilisée:

CopyIfNotNull(entry.Properties["something"].Value, out attribs.something);

void CopyIfNotNull(string src, out string dest)
{
  if(src != null)
    dest = src;
}
1
Mike Hall

Pourquoi ne pas utiliser une méthode auxiliaire comme celle-ci:

attribs.something = getString(
    entry.Properties["something"].Value, 
    attribs.something);

static String getString(
    Object obj,
    String defaultString)
{
    if (obj == null) return defaultString;
    return obj.ToString();
}

Vous pouvez également utiliser l'opérateur ??:

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

(notez l'appel ToString() redondant lorsque la valeur est null)

0
Zach Scrivena