IsNthing versus Is Nothing


130

Qualcuno qui utilizza VB.NET e ha una forte preferenza a favore o contro l'utilizzo IsNothingrispetto a Is Nothing(ad esempio, If IsNothing(anObject)o If anObject Is Nothing...)? Se è così, perché?

EDIT: Se pensi che siano entrambi ugualmente accettabili, pensi che sia meglio sceglierne uno e attenersi ad esso, o è OK mescolarli?


3
Ci sono molte buone ragioni per evitare di usareIsNothing()
KyleMit,

@JesseChisholm, C'è troppo per un singolo commento, ma il mio commento precedente ha pubblicato questo link in un articolo che elenca 5 diversi blog.reneorban.com/2011/12/vbnet-isnothing-vs-is-nothing.html
KyleMit

Le risposte tecnologiche sono davvero interessanti, ma peccato che la domanda sia stata lasciata un po 'troppo aperta e abbia generato alcune risposte inutili, solo preferenze personali sempre più vaghe
underscore_d

Risposte:


125

Se dai un'occhiata a MSIL mentre viene eseguito, vedrai che non si compila esattamente nello stesso codice. Quando usi IsNothing (), in realtà effettua una chiamata a quel metodo invece di valutare solo l'espressione.

Il motivo per cui tenderei ad usare "Is Nothing" è quando sto negando che diventa "IsNot Nothing" piuttosto che "Not IsNothing (object)" che personalmente ritengo più leggibile.


46

Trovo che Patrick Steele abbia risposto meglio a questa domanda sul suo blog: Avoiding IsNothing ()

Non ho copiato nessuna delle sue risposte qui, per garantire a Patrick Steele il merito del suo posto. Ma penso che se stai cercando di decidere se usare Is Nothing o IsNothing devi leggere il suo post. Penso che accetti che Is Nothing sia la scelta migliore.

Modifica: il commento di VoteCoffe qui

Contenuti dell'articolo parziale: dopo aver esaminato più codice ho scoperto un altro motivo per cui dovresti evitarlo: accetta tipi di valore! Ovviamente, poiché IsNothing () è una funzione che accetta un 'oggetto', puoi passargli tutto quello che vuoi. Se è un tipo di valore, .NET lo inscatolerà in un oggetto e lo passerà a IsNothing, che restituirà sempre false su un valore inscatolato! Il compilatore VB.NET verificherà la sintassi dello stile "Is Nothing" e non verrà compilato se si tenta di eseguire "Is Nothing" su un tipo di valore. Ma la funzione IsNothing () si compila senza lamentele. -PSteele - VoteCoffee


7
Contenuti dell'articolo parziale: dopo aver esaminato più codice ho scoperto un altro motivo per cui dovresti evitarlo: accetta tipi di valore! Ovviamente, poiché IsNothing () è una funzione che accetta un 'oggetto', puoi passargli tutto quello che vuoi. Se è un tipo di valore, .NET lo inscatolerà in un oggetto e lo passerà a IsNothing, che restituirà sempre false su un valore inscatolato! Il compilatore VB.NET verificherà la sintassi dello stile "Is Nothing" e non verrà compilato se si tenta di eseguire "Is Nothing" su un tipo di valore. Ma la funzione IsNothing () si compila senza lamentele. -PSteele
VoteCoffee

7
Ho pubblicato alcuni dei contenuti come non si sa mai se il link diventerà morto e ho pensato che aggiungesse un buon punto alla copertina.
VoteCoffee

33

Dovresti assolutamente evitare di usarlo IsNothing()

Ecco 4 motivi per l'articolo IsNothing () VS Is Nothing

  1. IsNothing(object)Ancora più importante, tutto gli è passato come oggetto, anche i tipi di valore! Poiché i tipi di valore non possono essere Nothing, si tratta di un controllo completamente sprecato.
    Prendi il seguente esempio:

    Dim i As Integer
    If IsNothing(i) Then
       ' Do something 
    End If

    Questo verrà compilato ed eseguito correttamente, mentre questo:

    Dim i As Integer
    If i Is Nothing Then
        '   Do something 
    End If

    Non verrà compilato, invece il compilatore genererà l'errore:

    L'operatore "Is" non accetta operandi di tipo "Intero".
    Gli operandi devono essere tipi di riferimento o nullable.

  2. IsNothing(object)è in realtà parte di una parte del Microsoft.VisualBasic.dll.
    Ciò è indesiderabile poiché si ha una dipendenza non necessaria dalla libreria VisualBasic.

  3. È lento - il 33,76% più lento (oltre 1000000000 iterazioni)!

  4. Forse preferenza personale, ma si IsNothing()legge come una Condizione Yoda . Quando guardi una variabile, stai controllando il suo stato, con esso come oggetto della tua indagine.

    cioè non si fa x? --- NON È xing una proprietà di esso ?

    Quindi penso che If a IsNot Nothinglegga meglio diIf Not IsNothing(a)


29

Sono d'accordo con "Is Nothing". Come detto sopra, è facile negare con "IsNot Nothing".

Lo trovo più facile da leggere ...

If printDialog IsNot Nothing Then
    'blah
End If

di questo...

If Not obj Is Nothing Then
    'blah
End If

5

VB è pieno di cose del genere che cercano di renderlo sia "come l'inglese" sia comodo per le persone che sono abituate alle lingue che usano () e {} molto. Ad esempio, sul lato "come inglese" ... VB ha la parola chiave " Ain't " ... e no, non sto scherzando. E dall'altro lato, come probabilmente già saprai la maggior parte delle volte puoi usare () con le chiamate di funzione se vuoi, ma non è necessario.

Preferisco IsNothing () ... ma uso C e C #, quindi è proprio quello che fa comodo. E penso che sia più leggibile. Ma vai con qualsiasi cosa ti senta più a tuo agio.


3
Il tuo link è morto, quindi per quello che vale qui è live: web.archive.org/web/20050308014055/http://ea.3leaf.com/2004/08/… Vale la pena notare, tuttavia, che contrariamente alla credenza popolare questo è non vero.
Matt Wilko,

5

Mi sto orientando verso l'alternativa "Is Nothing", principalmente perché sembra più OO.

Sicuramente Visual Basic non ha la parola chiave Ain't.


VB.NET può eseguire metodi di estensione? :)
klkitchens

2

Tendo anche a utilizzare la versione di Is Nothing in parte usandola tanto quanto faccio in SQL.


1

Inizialmente ho usato IsNothing ma mi sono spostato verso l'utilizzo di Is Nothing in progetti più recenti, principalmente per la leggibilità. L'unica volta che mi attengo a IsNothing è se mantengo il codice in cui viene utilizzato dappertutto e voglio rimanere coerente.


-2

Is Nothing richiede un oggetto che è stato assegnato al valore Nothing. IsNothing () può accettare qualsiasi variabile non inizializzata, anche di tipo numerico. Ciò è utile ad esempio quando si verifica se è stato passato un parametro opzionale.


Questo è sbagliato. Sei sicuro di non aver capito male? " IsNothing è progettato per funzionare con tipi di riferimento. Un tipo di valore non può contenere un valore di Nothing e ripristina il valore predefinito se si assegna Nothing [...] IsNothing restituisce sempre False ." Ma "Rappresenta il valore predefinito di qualsiasi tipo di dati. [...] Per i tipi di valore, [questo] dipende dal fatto che il tipo di valore sia nullable." Quindi non è meglio? Nothing Is Nothing
underscore_d
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.