web-dev-qa-db-fra.com

<> Et pas dans VB.NET

J'ai la tâche passionnante de découvrir les opérateurs <> et Not de VB.NET. Not - je suppose par ma petite utilisation - est l’équivalent fonctionnel de ! dans des langages tels que C # et <> est équivalent à !=.

Dans VB.NET, un problème courant concerne les expressions booléennes vis-à-vis des objets sans référence, apparaît-il. Donc si nous faisons

If Request.QueryString("MyQueryString") <> Nothing Then

Cela échouera réellement si la chaîne de requête n'existe pas. Pourquoi, je ne sais pas. La façon dont cela est fait par les anciens codeurs est la suivante:

If Not Request.QueryString("MyQueryString") Is Nothing Then

Et cela a tendance à fonctionner. Pour moi, ils sont fonctionnellement équivalents bien que les opérateurs tendent à faire des comparaisons différentes en fonction de certains facteurs tels que la priorité des opérateurs, la raison pour laquelle cela ne fonctionne pas dans ce cas, cependant, je ne le sais pas et je n'ai trouvé aucun matériel pertinent.

Je pose la question car je dois rédiger une documentation sur les normes et déterminer l’utilisation de la variable Not ou <>. Avez-vous des idées sur la manière dont cela devrait être, ou vous devriez le faire?

20
Kezzer

J'ai toujours utilisé les éléments suivants:

If Request.QueryString("MyQueryString") IsNot Nothing Then

Mais seulement parce que syntaxiquement, il se lit mieux.

Lors du test d'une entrée QueryString valide, j'utilise également les éléments suivants:

If Not String.IsNullOrEmpty(Request.QueryString("MyQueryString")) Then

Ce sont juste les méthodes que j'ai toujours utilisées afin que je ne puisse pas justifier leur utilisation si ce n'est le plus sensé pour moi lors de la relecture de code.

29
Charlie

Is n'est pas la même chose que = - Is compare les références, alors que = comparera les valeurs.

Si vous utilisez la version 2 de .Net Framework (ou une version ultérieure), il existe un opérateur IsNot qui fera le bon choix et lira plus naturellement.

10
Rowland Shaw

Je pense que votre question se résume à "la différence entre (Is et =) et aussi (IsNot et <>)".

La réponse dans les deux cas est la même:

= et <> sont définis implicitement pour les types de valeur et vous pouvez les définir explicitement pour vos types.

Is et IsNot sont conçus pour permettre des comparaisons entre les types de référence afin de vérifier si les deux références font référence au même objet.

Dans votre exemple, vous comparez un objet chaîne à Nothing (Null) et, comme les opérateurs =/<> sont définis pour les chaînes, le premier exemple fonctionne. Toutefois, cela ne fonctionne pas lorsqu'un Null est rencontré car les chaînes sont des types de référence et peuvent être Null. La meilleure façon (comme vous l'avez deviné) est la dernière version en utilisant Is/IsNot.

7
Cerebrus

Voici la réponse technique (développant la réponse de Rowland Shaw).

Le mot-clé Is vérifie si les deux opérandes sont des références à la même mémoire d’objet et ne renvoie vrai que si tel est le cas. Je crois qu'il est fonctionnellement équivalent à Object.ReferenceEquals . Le mot-clé IsNot est simplement une syntaxe abrégée pour écrire Not ... Is ..., rien de plus.

L'opérateur = (égalité) compare les valeurs et dans ce cas (comme dans beaucoup d'autres) équivaut à String.Equals . Maintenant, l'opérateur <> (inégalité) n'a pas tout à fait la même analogie que les mots clés Is et IsNot , car il peut être remplacé séparément de l'opérateur = en fonction sur la classe. Je pense que le cas devrait toujours être qu'il retourne l'inverse logique de l'opérateur = (et qu'il l'est certainement dans le cas de String), et permet simplement une comparaison plus efficace lors du test d'inégalité plutôt que d'égalité.

Lorsqu’il s’agit de chaînes, à moins que vous ne vouliez réellement comparer des références, utilisez toujours l’opérateur = (ou String.Equals, je suppose). Dans votre cas, étant donné que vous testez null ( Nothing ), il semble que vous deviez utiliser le mot clé Is ou IsNot (l'opérateur d'égalité échouera car il ne peut pas comparer le valeurs des objets nuls). Syntaxiquement, le IsNot mot-clé est un peu plus agréable ici, alors allez-y.

1
Noldorin

Utilisez simplement ce qui sonne le mieux… Je choisirais toutefois la première approche, car il semble y avoir moins d'opérations.

0
luiscubal

Si vous avez besoin de savoir si la variable existe, utilisez Is/IsNot Nothing.

L'utilisation de <> nécessite que l'opérateur "<>" soit défini pour la variable que vous évaluez .

 Dim b As HttpContext
 If b <> Nothing Then
    ...
 End If

et l'erreur résultante

Error   1   Operator '<>' is not defined for types 'System.Web.HttpContext' and 'System.Web.HttpContext'.   
0
hometoast

Les compilateurs C # et VB.NET génèrent souvent des IL différents pour des opérations apparemment équivalentes dans les deux langages. Il se trouve que C # agit comme prévu lorsque vous écrivez stringvar == null, mais pas VB.NET. Pour obtenir le même effet dans VB.NET, vous devez forcer l'égalité de référence vraie avec l'opérateur Is.

0
Christian Hayter

en fait, le paramètre Is est vraiment bon, car pour les développeurs, vous voudrez peut-être remplacer l'opérateur ==, pour le comparer à la valeur ... champ de A au paramètre. alors vous serez en difficulté en c # pour vérifier si l'objet de A est null avec le code suivant,

    A a = new A();
...
    if (a != null)
it will totally wrong, you always need to use if((object)a != null)
but in vb.net you cannot write in this way, you always need to write
    if not a is nothing then
or
    if a isnot nothing then

comme le disait Christian, vb.net n’attend rien.

0
Hzj_jie

Je suis un noob total, je suis venu ici pour comprendre la syntaxe de VB "pas égale à", alors j'ai décidé de la jeter ici si quelqu'un d'autre en avait besoin

<%If Not boolean_variable%>Do this if boolean_variable is false<%End If%>
0
Travis Heeter