c# - verificar - system nullreferenceexception error in vb net
Comprobación de nulo antes de ToString() (12)
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!
¿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 compilador (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;
}
}
¿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
)
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();
}
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();
// ^^
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).
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 .
No puedes hacer:
attribs.something = entry.Properties["something"].Value as string;
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;
}
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);
attribs.something = string.Format("{0}",entry.Properties["something"].Value)
attribs.something = String.Format("{0}", entry.Properties["something"].Value);
Sin embargo, no estoy seguro del rendimiento ...