Comprobación de nulo antes de ToString ()

Aquí está el escenario …

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

Si bien es efectivo y funciona correctamente, me parece feo. Si no compruebo un nulo antes de realizar el ToString (), arroja una excepción si la propiedad era nula. ¿Hay una mejor manera de manejar este escenario?

¡Muy apreciado!

Actualización 8 años después (¡guau!) Para cubrir el operador nulo condicional de c # 6 :

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

Otros enfoques:

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

También he usado esto, que no es terriblemente inteligente pero conveniente:

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

Si está apuntando a .NET Framework 3.5, la solución más elegante sería un método de extensión en mi opinión.

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

Entonces para usar:

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

Agregar una cadena vacía a un objeto es una expresión común que le permite hacer una conversión ToString nula, así:

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

Cuando entry.Properties["something"].Value es null , esto silenciosamente devuelve una string vacía.

Editar: comenzando con C # 6 puedes usar ?. operador para evitar la verificación null de una manera aún más simple:

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

No puedes hacer:

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

Sin embargo, no estoy seguro del rendimiento …

Como una variación a la respuesta de RexM:

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

El único inconveniente sería que a los attribs.something se les asignaría un valor (en sí mismo, en este ejemplo) incluso si entry.Properties [“algo”]. El valor era nulo, lo que podría ser costoso si la propiedad .something hiciera algún otro procesamiento y / o esta línea ejecuta mucho (como en un bucle).

Para hacer exactamente lo que intentas hacer, siempre se puede usar un método de ayuda:

 CopyIfNotNull(entry.Properties["something"].Value, out attribs.something); void CopyIfNotNull(string src, out string dest) { if(src != null) dest = src; } 

¿Es de alguna manera posible hacer algo como la respuesta de Dale Ragan anterior , pero anulando ToString () en lugar de crear un nuevo método NullSafeToString ()? Me gustaría que esto (o devolver “nulo”) sea el comportamiento predeterminado. El comstackdor (Visual C # 2010 Express) no se queja cuando agrego el siguiente método a la clase estática pública ObjectExtensions, pero el método no se llama …

 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 C # 6.0 puedes hacerlo de una manera muy elegante:

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

Y aquí hay un artículo sobre el nuevo operador con nulo condicional .

¿Qué le parece usar un método auxiliar como este?

 attribs.something = getString( entry.Properties["something"].Value, attribs.something); static String getString( Object obj, String defaultString) { if (obj == null) return defaultString; return obj.ToString(); } 

Alternativamente, podrías usar el ?? operador:

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

(tenga en cuenta la llamada ToString() redundante cuando el valor es null )