Question

Ceci est une question sur le langage VB.NET. Comme je l’utilise tous les jours, j’essaie simplement de comprendre les motivations qui sous-tendent certaines de ses constructions.

Je viens de découvrir que cette ligne:

If myObject Is Nothing then

est aussi correct que celui-ci:

If Nothing Is myObject Then

Même résultat. En utilisant ildasm, nous pouvons voir que ces lignes sont traduites en:

if myObject = null then

et

if null = myObject then

Bien, mais dans VB.NET, vous ne pouvez pas écrire:

if myObject = Nothing Then

Le compilateur n'acceptera pas cela.

Mmm, pour moi, Si rien ne vaut monObjet est beaucoup moins évident que Si monObjet = Rien .

Pourquoi les auteurs de VB.NET pensent-ils simplement le contraire? Un indice?

Était-ce utile?

La solution

Le problème que vous rencontrez est que VB.Net différencie les 2 types de comparaison d’objets. À savoir référence et comparaison de valeur.

Le " est " opérateur en VB.Net est utilisé pour la comparaison de référence. Ceci peut être utilisé lorsque les valeurs en question sont à la fois des types de référence ou des nullables. Tenter de comparer les types de valeur de cette manière entraînera une erreur de compilation.

Le " = " opérateur est utilisé pour la comparaison de valeur. La comparaison de valeur ne peut être utilisée que sur des types définissant un =, & Lt; & Gt; paire d'opérateurs dans leur définition de classe. L'implémentation réelle de l'égalité dépend de l'implémentation de l'opérateur.

C # adopte une approche différente en ce sens qu’il utilise == pour la comparaison des valeurs et des références. Ce qui est utilisé dépend de deux facteurs, dont le type des valeurs comparées et la mise en œuvre de certaines méthodes d’égalité.

Autres conseils

C’est l’une de ces choses héritées de VB6 et de COM. VB6 fait la distinction entre les objets de type référence (qui sont instanciables) et les types natifs tels que int. Les types de référence devaient être créés et affectés avec & "Définir &"; opérateur alors que les types natifs utilisaient simplement " = ".

Dans certains cas, vous pouvez écrire If myObject = Nothing Then, mais ce ne sera pas une comparaison nulle:

Dim someValue As Integer
If someValue = Nothing Then
    ' do something '
End If

Le code ci-dessus est équivalent à ce qui suit:

Dim someValue As Integer
If someValue = 0 Then
    ' do something '
End If

Dans ce cas, vous avez un type de valeur qui a son & "; emtpy &"; valeur (0 pour un Integer, Point.Empty pour une structure Point à titre d'exemple). L'opérateur Is effectue une référence de comparaison (vérifiant si les objets comparés sont la même instance), tandis que le signe égal est une comparaison de valeur .

Une autre idée est que VB est censé être plus détaillé si vous examinez la syntaxe de boucle et la syntaxe conditionnelle. Quelques exemples:

VB:

If x==0 Then
End If

While 
End While

For i = 0 to 10 Step 2
Next i

C #

 If x==0 
 {
 }

 While 
 {
 }

 for (int i = 0; i<=10;i+2)
 {
 }

Voir tous les mots supplémentaires dans le code VB.Net? C’est une autre raison possible de la différence.

L'utilisation de Is Nothing est une construction qui remonte à l'époque de Visual Basic classique (c'est-à-dire 6.0 et inférieur).

Pour conserver un semblant de compatibilité (tout comme la façon dont VB6 gère l'évaluation non lazy de l'instruction If), celle-ci a été transférée dans VB.NET.

Heureusement que ocdecio souligne que d'autres peccadilles similaires n'ont pas été reportées dans VB.NET, telles que l'instruction Set d'affectation d'objets à des variables.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top