ProgrammationApplication métier VB.NET

Expliquez comment fonctionne l'opérateur With...End With en Visual Basic, quels sont ses avantages et quels écueils peut cacher l'utilisation de constructions With imbriquées ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

L'opérateur With...End With permet de simplifier l'accès aux propriétés et méthodes d'un même objet, afin de ne pas répéter le nom de l'objet dans chaque expression. Toutes les références à l'intérieur du bloc se réfèrent à l'objet spécifié.

Exemple d'utilisation :

With myCustomer .Name = "Ivanov" .Balance += 1000 .LastPurchase = Now End With

Avantages :

  • Le code devient plus court, réduisant le nombre de fautes de frappe.
  • Plus pratique pour traiter des structures imbriquées, par exemple, le binding d'un formulaire à un objet.

Question piège.

Question : Peut-on imbriquer un bloc With dans un autre ? Que se passe-t-il avec les références aux propriétés et méthodes dans le bloc imbriqué ?

Réponse : Oui, l'imbrication est possible. Mais à l'intérieur du bloc interne, la référence avec un point (.) sera interprétée par rapport à l'objet interne. Si on utilise le même nom de propriété, cela entraînera une ambiguïté.

With obj1 .Value = 10 With obj2 .Value = 20 ' C'est obj2.Value, et non obj1.Value End With End With

Exemples d'erreurs réelles dues à une méconnaissance des subtilités du sujet.


Histoire

Dans la section With imbriquée, des propriétés avec le même nom ont été utilisées dans différents objets, et le développeur s'attendait à ce que l'attribution affecte l'objet externe. En conséquence, les données étaient écrites à un endroit incorrect, le problème n'est apparu qu'à la génération d'un rapport complexe, lorsque les valeurs ont été mélangées.


Histoire

Lors du refactoring de code, les fins de blocs End With ont été confondues. Dans un grand morceau de code, cela a conduit à ce que les expressions commencent à se référer à une autre instance d'objet (déjà fermée) et non celle attendue, ce qui a entraîné des erreurs d'exécution et des bogues difficilement détectables.


Histoire

Dans la logique métier, un With était utilisé pour des collections imbriquées. Après la mise à jour de la structure de la classe, une nouvelle propriété a été ajoutée avec un nom identique à ceux des propriétés de l'objet interne, ce qui a causé un conflit et une erreur de compilation, non détectée en raison de l'absence de tests unitaires pour ces cas.