2011-12-18 14 views
11

Sto ricevendo alcuni dati dal client sotto forma di JSON. Sto scrivendo questo:.Trim() quando la stringa è vuota o nulla

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

Se la variabile che viene analizzato da JSON torna vuoto, fa questo incidente codice quando chiamo il metodo .Trim()?

Grazie.

+2

Beh, sarà in crash se si tratta di nulla. .. – BoltClock

+19

(myValue ?? ""). Trim() funzionerà sempre. – Larry

+8

Con C# 6.0 possiamo ora utilizzare operatori con condizionamento nullo, come ilTesto? .Trim() – Santosh

risposta

17

Se il serializzatore restituisce una stringa vuota, Trim non farà nulla.

Se il serializzatore restituisce null, si riceverà NullReferenceException sulla chiamata a Trim.

Il tuo codice sarebbe meglio scritto (per quanto riguarda l'inizializzazione è in questione) in questo modo:

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

v'è alcun punto nel dichiarare e inizializzare la variabile e il immediatamente assegnando ad esso.

Di seguito sarebbe più sicuro, se non si sa cosa potrebbe restituire il serializzatore:

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

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

ok, questo per maggiore chiarezza. – frenchie

+0

Se devi tagliare un sacco di campi, questo è un problema, non c'è modo di estendere il metodo trim per non preoccuparsi se la stringa è nullo? – JsonStatham

+1

@SelectDistinct: puoi sempre scrivere un metodo di estensione che fa esattamente questo. – Oded

2

Innanzitutto, no, sarebbe non meglio inizializzare TheText a "". Ti stai assegnando subito dopo. (E se hai mai bisogno di usare una stringa vuota, usa invece string.Empty. Di solito è più chiaro ed è solo una pratica generalmente migliore.)

In secondo luogo, no, non si blocca - Trim() funziona perfettamente su una stringa vuota . Se per "vuoto" intendi che può essere null, allora sì, si bloccherà; si potrebbe risolvere il problema che, utilizzando l'operatore null coalesce:

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

Non penso che ci sia un accordo universale sul fatto che 'string.Empty' è meglio di' "" '. Io per primo preferisco "" "". – CodesInChaos

+0

@CodeInChaos: No, non c'è un accordo universale. È soprattutto un'opinione, ma potrebbe esserci qualche merito all'argomento [efficiency argument] (http://stackoverflow.com/questions/5650164/why-string-empty-is-more-recommended-than). Ma era solo un suggerimento. – Ryan

+2

Sono abbastanza sicuro che non ci sia alcun merito all'argomento efficiency di .net 4. I miei test hanno mostrato che '" "' e 'string.Empty' puntano la stessa istanza e quell'istanza è condivisa su AppDomains. Ci potrebbe essere una differenza quando si usa NGen, ma almeno per i programmi normali non sono riuscito a trovare alcuna differenza tecnica tra questi due. – CodesInChaos

10

Calling Trim() su una stringa vuota si tradurrà in una stringa vuota.Chiamata Trim() su null getterà NullReferenceException

+0

Qual è il modo più pulito per controllare 'string.IsNullOrEmptyOrBlank'? – Coops

+0

@CodeBlend: cosa intendi per bianco? –

+2

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

9

Se si dispone di un paio di campi da tagliare, ma le vostre eccezioni ottenendo per quei record che hanno valori nulli in determinati campi, quindi scrivendo un metodo di estensione rapido sarà il metodo più semplice:

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

esempio esempio di utilizzo:

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

È possibile utilizzare elvis operatore:

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

https://en.wikipedia.org/wiki/Elvis_operator per quelli ignari del significato di Elvis?: –

0

È possibile utilizzare questo codice come beblow

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