VB.NET – IsNothing versus È Nulla
Domanda
Qualcuno qui usa VB.NET e hanno una forte preferenza per o contro l'uso di IsNothing
in contrapposizione a Is Nothing
(per esempio, If IsNothing(anObject)
o If anObject Is Nothing...
)?Se è così, perché?
EDIT:Se si pensa che siano entrambi ugualmente accettabile, pensi che è meglio sceglierne uno e bastone con esso, o è OK per mescolare?
Soluzione
Se si prende uno sguardo alla MSIL come viene eseguito vedrai che non compilare giù per il codice stesso esatto.Quando si utilizza IsNothing() rende in realtà la chiamata al metodo, anziché limitarsi a valutare l'espressione.
Il motivo tenderei a propendere per l'utilizzo di "non È Niente" è quando sto negando diventa "No Niente "piuttosto che" Non IsNothing(oggetto)", che ritengo personalmente sembra più leggibile.
Altri suggerimenti
Trovo che Patrick Steele risposto a questa domanda meglio sul suo blog: Evitando IsNothing()
Non ho la copia di qualsiasi contenuto della sua risposta, al fine di garantire Patrick Steele ottenere credito per il suo post.Ma penso che se si sta cercando di decidere se utilizzare È Nulla o IsNothing si dovrebbe leggere il suo post.Credo che sarete d'accordo che È Nulla, è la scelta migliore.
Edit - VoteCoffe commento qui
Parziale contenuto dell'articolo:Dopo aver esaminato il codice più ho scoperto un altro motivo si dovrebbe evitare questo:Accetta i tipi di valore!Ovviamente, dato che IsNothing() è una funzione che accetta un "oggetto", si può passare qualsiasi cosa che si desidera farlo.Se si tratta di un tipo di valore .NET casella in oggetto e la passa al IsNothing-che restituisce sempre false per un valore boxed!Il VB.NET compilatore controllare il "non È Niente" stile e la sintassi non compilare se si tenta di eseguire un "non È Niente" su un tipo di valore.Ma il IsNothing() la funzione viene compilato senza reclami.-PSteele – VoteCoffee
Si dovrebbe evitare assolutamente l'utilizzo di IsNothing()
Qui sono 4 motivi dall'articolo IsNothing() VS È Nulla
Ancora più importante,
IsNothing(object)
ha tutto il passato come un oggetto, anche i tipi di valore!Poiché i tipi di valore non può essereNothing
, è completamente sprecato controllare.
Prendiamo il seguente esempio:Dim i As Integer If IsNothing(i) Then ' Do something End If
Questo consentirà di compilare ed eseguire bene, considerando che questo:
Dim i As Integer If i Is Nothing Then ' Do something End If
Non compilare, invece il compilatore genererà l'errore:
'È' operatore non accetta operandi di tipo 'Integer'.
Gli operandi devono essere di riferimento o tipi nullable.IsNothing(object)
in realtà è parte di una parte dellaMicrosoft.VisualBasic.dll
.
Questo è un effetto indesiderato come hai inutili dipendenza di VisualBasic biblioteca.Il suo lento - 33.76% più lento di fatto (oltre 1000000000 iterazioni)!
Forse preferenza personale, ma
IsNothing()
si legge come un Yoda Condizione.Quando si guarda a una variabile si usa il controllo è stato, come oggetto della vostra indagine.cioènon si fare x?--- NON È
x
ing", di proprietà di si?Quindi penso che
If a IsNot Nothing
legge meglio diIf Not IsNothing(a)
Sono d'accordo con "non È Niente".Come detto sopra, è facile negare con "IsNot Nothing".
Trovo che questo sia più facile da leggere...
If printDialog IsNot Nothing Then
'blah
End If
rispetto a questo...
If Not obj Is Nothing Then
'blah
End If
VB è pieno di cose del genere, cercando sia "come l'inglese" e confortevole per le persone che vengono utilizzati per le lingue che utilizzano () e {} un sacco.Per esempio, sul "come l'inglese"lato...VB è il "Non"la parola chiave...e no, non sto scherzando.E, d'altro lato, come probabilmente già sai la maggior parte del tempo è possibile utilizzare () con la funzione chiama se vuoi, ma non è necessario.
Io preferisco IsNothing()...ma io uso C e C#, in modo che solo ciò che è comodo.E credo che sia più leggibile.Ma vai con quello che si sente più comodo per voi.
Sto appoggiato verso il "non È Niente" alternativa, soprattutto perché sembra più OO.
Sicuramente Visual Basic non ottenuto non e ' una parola chiave.
Ho anche tendono ad utilizzare le È Niente di versione parzialmente utilizzando quanto a me in SQL.
Inizialmente ho utilizzato IsNothing ma sto muovendo verso l'utilizzo È Nulla in progetti più recenti, principalmente per migliorare la leggibilità.L'unica volta che ho bastone con IsNothing è che se io sono il mantenimento di codice in cui è utilizzato in tutto e voglio rimanere coerenti.
Si richiede Niente di un oggetto che è stato assegnato il valore di Niente.IsNothing() può prendere qualsiasi variabile che non è stata inizializzata, anche di tipo numerico.Questo è utile per esempio quando il test, se un parametro opzionale è stato superato.