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!
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();
}
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();
Convert.ToString(entry.Properties["something"].Value);
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();
// ^^
Ne pouvez-vous pas faire:
attribs.something = entry.Properties["something"].Value as string;
attribs.something = String.Format("{0}", entry.Properties["something"].Value);
Pas sûr de la performance cependant ...
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;
}
}
attribs.something = string.Format("{0}",entry.Properties["something"].Value)
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).
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;
}
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
)