image

VB et les StackOverFlowException

Je ne mets malheureusement quasiment plus les mains dans le code, mais j’ai eu le plaisir aujourd’hui de découvrir une particularité de VB.net qui m’a fait bondir au plafond et qui m’a laissé plus perplexe.

En effet à la vision de ce code :

image

J’ai été outré de découvrir que l’appel à cette propriété ne lève pas une StackOverFlowException.

L’appel à la propriété renvoie la valeur 0 sans autre forme de procès, sans exception, sans tousser, ni avertissement pour m’indiquer “hey ! mon garçon t’es sûr de vouloir faire ça ?”

Après avoir comme à mon habitude crié au loup, et pensé qu’il s’agissait d’un bug du compilateur ou de la CLR, j’ai essayé de comprendre par quel miracle le comportement rencontré pouvait se justifier.

Un petit tour par dotPeek et voilà le résultat :

image

Nouveau sursaut, j’en discute avec le leader technique de l’équipe qui est aussi perplexe que moi, et j’essaie de trouver la raison (certainement historique) pour laquelle nous avons ce comportement en VB, et rien choux blanc.

Comme à chaque fois que j’ai des questions dirons-nous particulières à propos des langages, j’ai donc contacté mon ami Jb Evain, qui après avoir pressenti que le sujet allait être rigolo à trouver l’explication de ce fonctionnement :

C’est tout à fait normal et même logique !

Il ne faut pas oublier que nous avons la possibilité en VB de faire ce type de code :

image

Nous pouvons en effet définir la valeur de retour d’une fonction en utilisant le nom de celle-ci.

La grosse différence avec le mot clé Return étant que le Return interrompt l’exécution de la méthode en cours, alors que ce n’est pas le cas dans l’exemple ci-dessous :

image

En effet, le code suivant l’affectation de la valeur de retour est bien exécuté.

Et si l’on reprend notre exemple, je pense que vous avez déjà compris qu’en réalité le code donné en exemple :

image

est en réalité équivalent à celui-là

image

ce qui explique la non levée d’une StackOverflowException !

2 réflexions au sujet de « VB et les StackOverFlowException »

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *