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?
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.
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.
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
.
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.
Utilisez simplement ce qui sonne le mieux… Je choisirais toutefois la première approche, car il semble y avoir moins d'opérations.
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'.
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
.
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.
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%>