2010-01-23 15 views
5

Qual è il migliore tra questi tre?String.IsNullOrEmpty (myString) Vs myString! = Null

string myString = ""; 
String.IsNullOrEmpty(myString); 

vs 

string myString = ""; 
if(myString.Length > 0 || myString != null) 

vs 

string myString = ""; 
if (m.Length > 0 | m != null) 

L'ex è più chiaro ma c'è qualche differenza di prestazioni tra questi? Cosa succede se, nel caso in cui una stringa non sia mai vuota, come se fosse presa da una casella di testo, che potrebbe essere vuota ma non nulla?

risposta

15

Ebbene, la versione nella domanda:

if(myString.Length > 0 || myString != null) 

sarebbe sicuramente essere peggio, come si dovrebbe verificare nullprima (non secondo) - idealmente corto circuito su null in modo da non tentare di chiamare .Length. Ma generalmente userei solo string.IsNullOrEmpty. È sempre possibile scrivere un metodo di estensione per renderlo meno dettagliato se lo si desidera (è possibile chiamare i metodi di estensione nei valori null).

static bool HasValue(this string s) { 
    return !string.IsNullOrEmpty(s); 
} 
+0

Sì, bel suggerimento quello scorso. Sono un po 'un sucker per string.Format metodi di estensione :) – Skurmedel

+0

Ottimo sempre, non ci ho mai pensato. –

+4

@Marc Gravell: Mi rendo conto che il metodo è statico, ma quando lo si chiama su una variabile di istanza, non tutti possono essere in grado di dire se tale chiamata genererà o meno un'eccezione di riferimento nullo. –

4

Vai con string.IsNullOrEmpty(str). È più chiaro e più sintetico. Non sarà un collo di bottiglia nella tua applicazione.

Se è necessario verificare la presenza di stringa "vuoto", quindi vorrei andare con un controllo contro string.Empty poiché esprime meglio l'intento.

+2

Inoltre è ++ per il riutilizzo del codice – abatishchev

2

Vorrei utilizzare IsNullOrEmpty.

Sarà più facile analizzare quando si guarda attraverso il codice in seguito.

Ecco un'altra ragione - un po 'bizzarra -. Qualche programmatore successivo è destinato ad arrivare più tardi, grattarsi la barba e dire "Penso che myString.trim(). Length! = 0 è meglio" e cambiarlo.

Come altri hanno sottolineato: il controllo per il secondo nullo è un potenziale errore di accesso nullo in attesa di accadere - la routine di libreria è garantita per essere ok.

+4

Da qui la creazione di "IsNullOrWhitespace': http://msdn.microsoft.com /en-us/library/system.string.isnullorwhitespace(VS.100).aspx –

1

Il String.IsNullOrEmpty è la scelta migliore se non si è sicuri su come testare i diversi stati del riferimento di stringa (che ovviamente si è, come si è sbagliato ...;).

Usando il metodo IsNullOrEmpty:

if (String.IsNullOrEmpty(s)) ... 

è equivalente all'utilizzo di un corto circuito di prova per nulla e lunghezza zero:

if (s == null || s.Length == 0) ... 

Se si sa che il referene non può essere nullo, si può saltare tale controllo e basta controllare la lunghezza:

if (s.Length == 0) ... 

Il metodofunzionerebbe anche in situazioni normali, ma nel caso in cui qualcosa sia andato storto e il riferimento sia effettivamente nullo, il metodo IsNullOrEmpty lo accetterebbe in modo silenzioso, mentre normalmente si vorrà essere consapevoli dell'errore.

0

Credo che lo String.IsNullOrEmpty (String s) è implementato come:

if (s == null || s.Length == 0) ...

nell'API.

+0

... il che significa che, per quanto riguarda il codice IL, viene generato lo stesso IL. Né è più veloce dell'altro. – Blade3

+3

Non sono sicuro se ok per inserirlo qui, ma usando Disassembler, questo è l'API per String.IsNullOrEmptr (value) { if (value! = Null) { return (value.Lunghezza == 0); } return true;} –

+0

Probabilmente si tratta di un artefatto di disassemblaggio piuttosto che di come il codice sia effettivamente visualizzato. – ICR

2

Come altri hanno già detto, IsNullOrEmpty() è superiore ai controlli manuali ai fini della manutenibilità e non rischia di risentirne le prestazioni grazie alle decisioni di runtime del compilatore JIT sulla inlining (vedere Eric Gunnerson's comments).

Nel caso in cui nessun altro si chiede cosa l'effettiva attuazione .NET sembra, ecco il codice .NET 4:

[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")] 
public static bool IsNullOrEmpty(string value) 
{ 
    if (value != null) 
    { 
     return (value.Length == 0); 
    } 
    return true; 
} 

Questo attributo indica il metodo sarà anche inline in NGen (vale a dire, nativo) immagini.

+0

Interessante, ** ILSpy.exe ** mostra che ** mscorlib ** -> ** Sistema ** -> ** Stringa ** -> ** IsNullOrEmpty (stringa): bool ** si presenta così: ** ' valore di ritorno == null || value.Length == 0; '**. –

-2

I believe the String.IsNullOrEmpty(String s) is implemented as: if (s == null || s.Length == 0) ... in the API.

che è sbagliato. Provalo e otterrai un'eccezione in quanto verranno provate le due affermazioni. Se s è nullo, allora s.Length genererà un execption.

+1

'||' cortocircuiti, quindi no, la seconda espressione non verrà valutata se 's' è' null'. Inoltre, non una risposta. – Ryan

Problemi correlati