N'est rien contre n'est rien

130

Est-ce que quelqu'un ici utilise VB.NET et a une forte préférence pour ou contre l'utilisation IsNothingpar opposition à Is Nothing(par exemple, If IsNothing(anObject)ou If anObject Is Nothing...)? Si oui, pourquoi?

EDIT: Si vous pensez qu'ils sont tous les deux également acceptables, pensez-vous qu'il est préférable d'en choisir un et de vous en tenir à lui, ou est-il acceptable de les mélanger?

Luke Girvin
la source
3
Il y a beaucoup de bonnes raisons d'éviter d'utiliserIsNothing()
KyleMit
@JesseChisholm, Il y en a trop pour un seul commentaire, mais mon précédent commentaire a posté ce lien vers un article qui en énumère 5 différents blog.reneorban.com/2011/12/vbnet-isnothing-vs-is-nothing.html
KyleMit
Les réponses techniques sont vraiment intéressantes, mais dommage que la question ait été laissée un peu trop ouverte et ait généré des réponses sans utilité, juste une préférence personnelle de plus en plus vague
underscore_d

Réponses:

125

Si vous regardez le MSIL pendant son exécution, vous verrez qu'il ne se compile pas exactement avec le même code. Lorsque vous utilisez IsNothing (), il effectue en fait un appel à cette méthode au lieu de simplement évaluer l'expression.

La raison pour laquelle j'aurais tendance à me pencher vers l'utilisation de "Is Nothing" est que lorsque je nie, cela devient "IsNot Nothing" plutôt que "Not IsNothing (objet)" qui, personnellement, me semble plus lisible.

lomaxx
la source
46

Je trouve que Patrick Steele a le mieux répondu à cette question sur son blog: Avoiding IsNothing ()

Je n'ai copié aucune de sa réponse ici, pour m'assurer que Patrick Steele obtiendra le crédit de son poste. Mais je pense que si vous essayez de décider d'utiliser Is Nothing ou IsNothing, vous devriez lire son message. Je pense que vous conviendrez que Is Nothing est le meilleur choix.

Edit - Commentaire de VoteCoffe ici

Contenu partiel de l'article: Après avoir examiné plus de code, j'ai découvert une autre raison pour laquelle vous devriez éviter cela: il accepte les types de valeur! Évidemment, puisque IsNothing () est une fonction qui accepte un «objet», vous pouvez lui passer tout ce que vous voulez. S'il s'agit d'un type valeur, .NET le placera dans un objet et le passera à IsNothing - qui retournera toujours false sur une valeur encadrée! Le compilateur VB.NET vérifiera la syntaxe de style "Is Nothing" et ne compilera pas si vous essayez de faire un "Is Nothing" sur un type valeur. Mais la fonction IsNothing () compile sans se plaindre. -PSteele - VoteCoffee

Jack Snipes
la source
7
Contenu partiel de l'article: après avoir examiné plus de code, j'ai découvert une autre raison pour laquelle vous devriez éviter cela: il accepte les types de valeur! Évidemment, puisque IsNothing () est une fonction qui accepte un «objet», vous pouvez lui passer tout ce que vous voulez. S'il s'agit d'un type valeur, .NET le placera dans un objet et le passera à IsNothing - qui retournera toujours false sur une valeur encadrée! Le compilateur VB.NET vérifiera la syntaxe de style "Is Nothing" et ne compilera pas si vous essayez de faire un "Is Nothing" sur un type valeur. Mais la fonction IsNothing () compile sans se plaindre. -PSteele
VoteCoffee
7
Posté une partie du contenu car vous ne savez jamais si le lien deviendra mort et j'ai pensé que cela ajoutait un bon point à la couverture.
VoteCoffee
33

Vous devez absolument éviter d'utiliser IsNothing()

Voici 4 raisons tirées de l'article IsNothing () VS Is Nothing

  1. Plus important encore, IsNothing(object)tout lui est-il passé en tant qu'objet, même les types valeur! Étant donné que les types de valeur ne peuvent pas l'être Nothing, c'est une vérification complètement inutile.
    Prenons l'exemple suivant:

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

    Cela compilera et fonctionnera correctement, alors que ceci:

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

    Ne compilera pas, mais le compilateur lèvera l'erreur:

    L'opérateur 'Is' n'accepte pas les opérandes de type 'Integer'.
    Les opérandes doivent être des types référence ou nullable.

  2. IsNothing(object)fait en fait partie du Microsoft.VisualBasic.dll.
    Cela n'est pas souhaitable car vous avez une dépendance inutile sur la bibliothèque VisualBasic.

  3. C'est lent - 33,76% plus lent en fait (plus de 1000000000 itérations)!

  4. Peut-être une préférence personnelle, mais se IsNothing()lit comme une condition Yoda . Lorsque vous regardez une variable, vous vérifiez son état, avec elle comme sujet de votre enquête.

    c'est-à-dire fait- il x? --- NON est - xing une propriété de ce ?

    Donc je pense If a IsNot Nothingque c'est mieux queIf Not IsNothing(a)

KyleMit
la source
29

Je suis d'accord avec "Is Nothing". Comme indiqué ci-dessus, il est facile de nier avec "IsNot Nothing".

Je trouve cela plus facile à lire ...

If printDialog IsNot Nothing Then
    'blah
End If

que ça ...

If Not obj Is Nothing Then
    'blah
End If
fiergeekdad
la source
5

VB est plein de choses comme ça qui essaient de le rendre à la fois "comme l'anglais" et confortable pour les gens qui sont habitués aux langues qui utilisent beaucoup () et {}. Par exemple, du côté "comme l'anglais" ... VB a le mot-clé " Ain't " ... et non, je ne plaisante pas. Et de l'autre côté, comme vous le savez probablement déjà la plupart du temps, vous pouvez utiliser () avec des appels de fonction si vous le souhaitez, mais ce n'est pas obligatoire.

Je préfère IsNothing () ... mais j'utilise C et C #, c'est donc ce qui est confortable. Et je pense que c'est plus lisible. Mais optez pour ce qui vous convient le mieux.

Adam Haile
la source
3
Votre lien est mort donc pour ce qu'il vaut ici est un live: web.archive.org/web/20050308014055/http : //ea.3leaf.com/2004/08/... A noter cependant que contrairement à la croyance populaire c'est pas vrai.
Matt Wilko
5

Je penche vers l'alternative "Is Nothing", principalement parce qu'elle semble plus OO.

Visual Basic n'a sûrement pas le mot clé Ain't.

temps mort
la source
VB.NET peut-il faire des méthodes d'extension? :)
klkitchens
2

J'ai également tendance à utiliser la version Is Nothing partiellement en l'utilisant autant que je le fais en SQL.

Brian Childress
la source
1

J'ai d'abord utilisé IsNothing mais j'ai évolué vers l'utilisation de Is Nothing dans de nouveaux projets, principalement pour la lisibilité. La seule fois où je m'en tiens à IsNothing, c'est si je maintiens le code là où il est utilisé tout au long et je veux rester cohérent.

Chris Tybur
la source
-2

Is Nothing nécessite un objet qui a été affecté à la valeur Nothing. IsNothing () peut prendre n'importe quelle variable qui n'a pas été initialisée, y compris de type numérique. Ceci est utile par exemple pour tester si un paramètre facultatif a été passé.

ybacou
la source
C'est faux. Êtes-vous sûr que vous ne l'avez pas fait dans le mauvais sens? " IsNothing est destiné à fonctionner sur les types référence. Un type valeur ne peut pas contenir la valeur Nothing et revient à sa valeur par défaut si vous affectez Nothing [...] IsNothing renvoie toujours False ." Mais "Représente la valeur par défaut de tout type de données. [...] Pour les types valeur, [cela] dépend si le type valeur est Nullable." Alors n'est-ce pas mieux? Nothing Is Nothing
underscore_d