IsNothing versus Is Nothing

130

Verwendet hier jemand VB.NET und hat eine starke Präferenz für oder gegen die Verwendung IsNothingim Gegensatz zu Is Nothing(zum Beispiel If IsNothing(anObject)oder If anObject Is Nothing...)? Wenn ja warum?

EDIT: Wenn Sie denken, dass beide gleich akzeptabel sind, denken Sie, dass es am besten ist, eine auszuwählen und dabei zu bleiben, oder ist es in Ordnung, sie zu mischen?

Luke Girvin
quelle
3
Es gibt viele gute Gründe, die Verwendung zu vermeidenIsNothing()
KyleMit
@JesseChisholm, es gibt zu viel für einen einzelnen Kommentar, aber mein vorheriger Kommentar hat diesen Link zu einem Artikel gepostet, der 5 verschiedene auflistet. Blog.reneorban.com/2011/12/vbnet-isnothing-vs-is-nothing.html
KyleMit
Die technischen Antworten sind wirklich interessant, aber schade, dass die Frage etwas zu offen gelassen wurde und einige Antworten ohne Verwendung generierte, nur zunehmend vage persönliche Vorlieben
underscore_d

Antworten:

125

Wenn Sie sich die MSIL während der Ausführung ansehen, werden Sie feststellen, dass sie nicht auf genau denselben Code kompiliert wird. Wenn Sie IsNothing () verwenden, wird diese Methode tatsächlich aufgerufen, anstatt nur den Ausdruck auszuwerten.

Der Grund, warum ich dazu neige, "Is Nothing" zu verwenden, ist, wenn ich negiere, dass es eher "IsNot Nothing" als "Not IsNothing (Objekt)" wird, was meiner Meinung nach besser lesbar ist.

Lomaxx
quelle
46

Ich finde, dass Patrick Steele diese Frage am besten in seinem Blog beantwortet hat: Vermeiden von IsNothing ()

Ich habe keine seiner Antworten hier kopiert, um sicherzustellen, dass Patrick Steele seinen Beitrag gutschreibt. Aber ich denke, wenn Sie versuchen zu entscheiden, ob Sie Is Nothing oder IsNothing verwenden möchten, sollten Sie seinen Beitrag lesen. Ich denke, Sie werden mir zustimmen, dass Is Nothing die beste Wahl ist.

Bearbeiten - VoteCoffe's Kommentar hier

Teilweise Artikelinhalt: Nachdem ich mehr Code überprüft hatte, fand ich einen weiteren Grund heraus, warum Sie dies vermeiden sollten: Es akzeptiert Werttypen! Da IsNothing () eine Funktion ist, die ein 'Objekt' akzeptiert, können Sie natürlich alles übergeben, was Sie wollen. Wenn es sich um einen Werttyp handelt, packt .NET ihn in ein Objekt ein und übergibt ihn an IsNothing - was bei einem Wert in einem Box immer false zurückgibt! Der VB.NET-Compiler überprüft die Syntax im "Is Nothing" -Stil und kompiliert nicht, wenn Sie versuchen, ein "Is Nothing" für einen Werttyp auszuführen. Die Funktion IsNothing () wird jedoch ohne Beschwerden kompiliert. -PSteele - VoteCoffee

Jack Snipes
quelle
7
Teilweise Artikelinhalt: Nachdem ich mehr Code überprüft hatte, fand ich einen weiteren Grund heraus, warum Sie dies vermeiden sollten: Es akzeptiert Werttypen! Da IsNothing () eine Funktion ist, die ein 'Objekt' akzeptiert, können Sie natürlich alles übergeben, was Sie wollen. Wenn es sich um einen Werttyp handelt, packt .NET ihn in ein Objekt ein und übergibt ihn an IsNothing - was bei einem Wert in einem Box immer false zurückgibt! Der VB.NET-Compiler überprüft die Syntax im "Is Nothing" -Stil und kompiliert nicht, wenn Sie versuchen, ein "Is Nothing" für einen Werttyp auszuführen. Die Funktion IsNothing () wird jedoch ohne Beschwerden kompiliert. -PSteele
VoteCoffee
7
Ich habe einige Inhalte gepostet, da Sie nie wissen, ob der Link tot sein wird, und ich dachte, dass er der Abdeckung einen guten Punkt hinzufügt.
VoteCoffee
33

Sie sollten die Verwendung unbedingt vermeiden IsNothing()

Hier sind 4 Gründe aus dem Artikel IsNothing () VS Is Nothing

  1. Am wichtigsten IsNothing(object)ist, dass alles als Objekt übergeben wurde, sogar Werttypen! Da Werttypen nicht sein können Nothing, ist es eine völlig verschwendete Prüfung.
    Nehmen Sie das folgende Beispiel:

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

    Dies wird kompiliert und läuft gut, während dies:

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

    Wird nicht kompiliert, stattdessen wird der Compiler den Fehler auslösen:

    Der Operator 'Is' akzeptiert keine Operanden vom Typ 'Integer'.
    Operanden müssen Referenztypen oder nullbare Typen sein.

  2. IsNothing(object)ist eigentlich Teil eines Teils der Microsoft.VisualBasic.dll.
    Dies ist unerwünscht, da Sie eine nicht benötigte Abhängigkeit von der VisualBasic-Bibliothek haben.

  3. Es ist langsam - 33,76% langsamer (über 1000000000 Iterationen)!

  4. Vielleicht persönliche Präferenz, IsNothing()liest sich aber wie ein Yoda-Zustand . Wenn Sie sich eine Variable ansehen, überprüfen Sie ihren Status, wobei diese Gegenstand Ihrer Untersuchung ist.

    dh macht es x? --- NICHT Ist es xeine Eigenschaft davon ?

    Also ich denke If a IsNot Nothingliest sich besser alsIf Not IsNothing(a)

KyleMit
quelle
29

Ich stimme "Is Nothing" zu. Wie oben erwähnt, ist es einfach, mit "IsNot Nothing" zu negieren.

Ich finde das leichter zu lesen ...

If printDialog IsNot Nothing Then
    'blah
End If

als das...

If Not obj Is Nothing Then
    'blah
End If
stolzgeekdad
quelle
5

VB ist voll von solchen Dingen, die versuchen, es sowohl "wie Englisch" als auch komfortabel für Leute zu machen, die an Sprachen gewöhnt sind, die () und {} häufig verwenden. Zum Beispiel auf der Seite "wie Englisch" ... VB hat das Schlüsselwort " Ain't " ... und nein, ich scherze nicht. Und auf der anderen Seite, wie Sie wahrscheinlich schon die meiste Zeit wissen, können Sie () mit Funktionsaufrufen verwenden, wenn Sie möchten, aber nicht müssen.

Ich bevorzuge IsNothing () ... aber ich benutze C und C #, also ist das genau das, was bequem ist. Und ich denke, es ist besser lesbar. Aber gehen Sie mit allem, was sich für Sie angenehmer anfühlt.

Adam Haile
quelle
3
Ihr Link ist tot. Was es hier wert ist, ist ein Live- Link : web.archive.org/web/20050308014055/http://ea.3leaf.com/2004/08/… Bemerkenswert ist jedoch, dass dies entgegen der landläufigen Meinung der Fall ist nicht wahr.
Matt Wilko
5

Ich neige zur Alternative "Is Nothing", vor allem, weil es mehr OO zu sein scheint.

Sicherlich hat Visual Basic nicht das Schlüsselwort Ain't.

Todeszeit
quelle
Kann VB.NET Erweiterungsmethoden ausführen? :)
klkitchens
2

Ich neige auch dazu, die Is Nothing-Version teilweise zu verwenden, weil ich sie genauso oft benutze wie in SQL.

Brian Childress
quelle
1

Ich habe ursprünglich IsNothing verwendet, aber ich habe Is Nothing in neueren Projekten verwendet, hauptsächlich aus Gründen der Lesbarkeit. Das einzige Mal, wenn ich bei IsNothing bleibe, ist, wenn ich Code dort pflege, wo er überall verwendet wird, und ich möchte konsistent bleiben.

Chris Tybur
quelle
-2

Is Nothing erfordert ein Objekt, das dem Wert Nothing zugewiesen wurde. IsNothing () kann jede nicht initialisierte Variable annehmen, auch vom numerischen Typ. Dies ist beispielsweise nützlich, wenn Sie testen, ob ein optionaler Parameter übergeben wurde.

ybacou
quelle
Das ist falsch. Bist du sicher, dass du es nicht falsch verstanden hast? " IsNothing soll für Referenztypen arbeiten. Ein Werttyp kann keinen Wert von Nothing enthalten und wird auf seinen Standardwert zurückgesetzt, wenn Sie Nothing zuweisen. [...] IsNothing gibt immer False zurück ." Aber „Stellt den Standardwert eines beliebigen Datentyps. [...] Für Werttypen, [diese] hängt davon ab , ob der Wert Typ NULL - Werte zulässt.“ Also ist es nicht besser? Nothing Is Nothing
underscore_d