2011-12-18 19 views
11

Recibo algunos datos del cliente en forma de json. estoy escribiendo esto:.Trim() cuando la cadena está vacía o nula

string TheText; // or whould it be better string TheText = ""; ? 
TheText = ((serializer.ConvertToType<string>(dictionary["TheText"])).Trim()); 

Si la variable que está siendo analizada desde JSON regresa vacía, hace esto accidente código cuando llamo el método .trim()?

Gracias.

+2

Bueno, va a chocar si es nulo. .. – BoltClock

+19

(myValue ?? "") .Trim() siempre funcionará. – Larry

+8

Con C# 6.0 ahora podemos usar operadores nulos-condicionales, como el Texto? .Trim() – Santosh

Respuesta

17

Si el serializador devuelve una cadena vacía, Trim no hará nada.

Si el serializador devuelve null, obtendrá un NullReferenceException en la llamada al Trim.

Su código sería mejor escrito (por lo que la inicialización se refiere) de esta manera:

string theText = 
      ((serializer.ConvertToType<string>(dictionary["TheText"])).Trim()); 

No hay ningún punto en declarar e inicializar la variable y el inmediato asignar a la misma.

El siguiente sería más seguro, si usted no sabe lo que podría devolver el serializador:

string theText = ((serializer.ConvertToType<string>(dictionary["TheText"]))); 

if(!string.IsNullOrEmpty(theText)) 
{ 
    theText = theText.Trim(); 
} 
+1

bien, eso lo hace más claro. – frenchie

+0

Sin embargo, si tiene que recortar un montón de campos, esto es una molestia, ¿no hay forma de ampliar el método de recorte para que no moleste si la cuerda es nula? – JsonStatham

+1

@SelectDistinct: siempre puede escribir un método de extensión que hace exactamente eso. – Oded

2

En primer lugar, no, no sería ser mejor para inicializar TheText a "". Lo estás asignando justo después. (Y si alguna vez es necesario utilizar una cadena vacía, utilice string.Empty lugar Por lo general es más clara y es generalmente mejor práctica..)

En segundo lugar, no, no va a estrellarse - Trim() funciona bien en una cadena vacía . Si por "vacío" quiere decir que puede ser null, entonces sí, se bloqueará; usted podría arreglar eso usando el operador nulo se unen:

string TheText = (serializer.ConvertToType<string>(dictionary["TheText"]) ?? string.Empty).Trim(); 
+3

No creo que haya un acuerdo universal de que 'string.Empty' es mejor que' "" '. Yo prefiero '" "'. – CodesInChaos

+0

@CodeInChaos: No, no hay acuerdo universal. En su mayoría es opinión, pero puede haber algún mérito para [argumento de eficiencia] (http://stackoverflow.com/questions/5650164/why-string-empty-is-more-recommended-than). Pero fue solo una sugerencia. – Ryan

+2

Estoy bastante seguro de que no hay ningún mérito para el argumento de eficiencia a partir de .net 4. Mis pruebas mostraron que '" "' y 'string.Empty' apuntan a la misma instancia, y esa instancia se comparte en AppDomains. Puede haber una diferencia al usar NGen, pero al menos para los programas normales no pude encontrar ninguna diferencia técnica entre esos dos. – CodesInChaos

10

Calling Trim() en una cadena vacía se traducirá en una cadena vacía.Llamando Trim() en null lanzará NullReferenceException

+0

¿Cuál es la forma más limpia de comprobar 'string.IsNullOrEmptyOrBlank'? – Coops

+0

@CodeBlend: ¿Qué quieres decir con blanco? –

+2

Aha - [String.IsNullOrWhiteSpace] (http://msdn.microsoft.com/en-us/library/system.string.isnullorwhitespace.aspx) – Coops

9

Si usted tiene unos pocos campos que desea recortar, pero sus excepciones conseguir para aquellos registros que tienen valores nulos en algunos campos, a continuación, escribir un método de extensión rápida será el método más sencillo:

public static class ExtensionMethods 
    { 
     public static string TrimIfNotNull(this string value) 
     { 
      if (value != null) 
      { 
       return value.Trim(); 
      } 
      return null; 
     } 
    } 

ejemplo ejemplo de uso:

string concatenated = String.Format("{0} {1} {2}", myObject.fieldOne.TrimIfNotNull(), myObject.fieldTwo.TrimIfNotNull(), myObject.fieldThree.TrimIfNotNull()); 
5

Puede utilizar Elvis operador:

GetNullableString()?.Trim(); // returns NULL or trimmed string 
+0

https://en.wikipedia.org/wiki/Elvis_operator para los desconocidos del significado de Elvis? –

0

Usted puede utilizar este código como beblow

string theText = (((serializer.ConvertToType<string>(dictionary["TheText"])))+ string.Empty).Trim(); 
Cuestiones relacionadas