Pregunta 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!


74
2018-02-15 05:34


origen


Respuestas:


Actualización 8 años después (wow!) Para cubrir 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();
}

117
2018-02-15 05:39



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

41
2018-02-15 06:06



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

38
2018-01-24 22:45



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

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

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

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

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

3
2017-09-12 10:27



No puedes hacer:

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

2
2018-04-26 17:06



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

Sin embargo, no estoy seguro del rendimiento ...


2
2018-03-04 19:00



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


1
2018-02-15 05:47



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

1
2018-02-15 05:48