2012-07-02 13 views

risposta

7

Stanno controllando il samething, ma potrebbero essere significati per controllare cose diverse.

If IsNothing(TestString) Then 

E

If TestString = Nothing Then 

sono prova diversa - il primo è usato raramente, perché typicaly desideri solo davvero sapere se ha un valore non vuoto. Ma può essere usato per trattare una stringa vuota e un valore nullo in modo diverso in un DB, o per rilevare l'uso di un parametro facoltativo (entrambi i casi richiedono un lavoro extra per essere sicuri di non introdurre inavvertitamente un valore errato, quindi in qualche modo fragile).

Nell'esempio riportato, il test è in realtà un po 'prolisso e confuso, se è questo che si vuole testare poi Se String.IsNullOrEmpty (TestString) Poi

è il modo per andare su di esso. Se "e" dovevano essere un "o", allora avrebbe senso usare IsNothing (TestString).

14

Nothing sarebbe alcuna stringa affatto (null in altre lingue), che è diverso da una stringa vuota (""), che è in realtà una stringa.

Tuttavia, il controllo deve essere sostituito con If Not String.IsNullOrEmpty(TestString) Then, che rende più chiaro ciò che si sta facendo esattamente.

Ho appena giocato con questo in LINQPad e ho trovato qualcosa di leggermente sorprendente. In VB.NET:

Dim s1 as string = Nothing 
Dim s2 as string = "" 

Console.WriteLine(s1 is Nothing) 'True 
Console.WriteLine(s2 is Nothing) 'False 

Console.WriteLine(s1 = "") 'True 
Console.WriteLine(s2 = "") 'True 

Console.WriteLine(string.IsNullOrEmpty(s1)) 'True 
Console.WriteLine(string.IsNullOrEmpty(s2)) 'True 

In C#:

string s1 = null; 
string s2 = ""; 

Console.WriteLine(s1 == null); //True 
Console.WriteLine(s2 == null); //False 

Console.WriteLine(s1 == ""); //False 
Console.WriteLine(s2 == ""); //True 

Console.WriteLine(string.IsNullOrEmpty(s1)); //True 
Console.WriteLine(string.IsNullOrEmpty(s2)); //True 

non ero abbastanza aspettavo. Sembra che VB.Net tratti uno Nothing come una stringa vuota. La mia ipotesi è per la compatibilità con le versioni precedenti di VB.

Questo rinforza tanto più che si dovrebbe usare String.IsNullOrEmpty per questi tipi di controlli, in quanto è più esplicito quello che si sta controllando, e funziona come previsto.

+1

+1 mi ha rubato le parole dalla bocca. Erich, se una stringa non è stata impostata è Nothing, se una stringa è = "" è vuota. –

+0

Sono totalmente confuso. Su MSDN si dice che per le variabili di tipo String in VB, Nothing = "". Se questo è il caso, sembra che quanto sopra sia ridondante –

+1

La mia ipotesi sarebbe che sia stata fatta da qualcuno che aveva più familiarità con C#, che ha un comportamento diverso, e non conosce IsNullOrEmpty. –

3

Sì, per definizione, in VB.NET "" equivale a Nothing anche per =, <> e tutto VB funzioni; a meno che non ti interessi esplicitamente la differenza, ad esempio verificando con Is.

Ovviamente, verranno visualizzate le differenze quando si utilizzano le funzioni generali .NET e in particolare i metodi in cui str.Method non riuscirà con un'eccezione di riferimento Null.

BTW Direi che l'estratto nell'OP è il codice C# (malamente) convertito.

Problemi correlati