ProgrammationDéveloppeur VB.NET

Décrivez le fonctionnement et les caractéristiques de la gestion des événements (Events) et des délégués (Delegates) en Visual Basic .NET. Quels problèmes peuvent survenir en cas de mauvaise utilisation ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

En Visual Basic .NET, les délégués (Delegate) sont des objets qui encapsulent une référence à une méthode, tandis que les événements (Events) sont un mécanisme de notification des abonnés concernant certaines conditions ou changements. Les délégués permettent de "transmettre" un comportement (méthodes) comme paramètres, et les événements implémentent le modèle éditeur-abonné.

Caractéristiques :

  • Les événements sont déclarés à l'aide du mot clé Event à l'intérieur d'une classe.
  • Les délégués définissent la signature des méthodes que l'on peut abonner à un événement.
  • L'abonnement se fait via AddHandler et le désabonnement — via RemoveHandler.

Exemple :

' Définition d'un délégué Public Delegate Sub NotifyHandler(ByVal message As String) ' Classe avec un événement Public Class Notifier Public Event OnNotify As NotifyHandler Public Sub DoWork() RaiseEvent OnNotify("Travail terminé !") End Sub End Class ' Abonnement et appel Dim n As New Notifier() AddHandler n.OnNotify, AddressOf SubNotify Sub SubNotify(ByVal msg As String) Console.WriteLine(msg) End Sub n.DoWork()

Les événements sont particulièrement utiles dans la programmation UI et la répartition de la logique métier.

Question piège

Que se passe-t-il si vous appelez l'événement RaiseEvent et qu'il n'y a pas d'abonnés ?

Réponse incorrecte : Il y aura une erreur d'exécution.

Réponse correcte : Rien ne se passe — s'il n'y a pas d'abonnés à l'événement, l'appel de RaiseEvent est sûr, il n'y aura pas d'exception.

Exemple :

Public Event OnUpdate() ' Appel RaiseEvent, même si personne n'est abonné : RaiseEvent OnUpdate() ' Acceptable et ne provoque pas d'erreur

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


Histoire
Dans une grande application de bureau, le développeur n'a pas désabonné les gestionnaires des événements, ce qui a entraîné une non-libération des objets par le ramasse-miettes (memory leak). Cela a provoqué une augmentation de la mémoire et des crashes après quelques heures de fonctionnement.


Histoire
Un jeune professionnel, ne comprenant pas le fonctionnement des délégués et des événements, a accidentellement abonné une méthode plusieurs fois de suite. Cela a conduit à des appels multiples des mêmes gestionnaires — les utilisateurs recevaient des notifications en double.


Histoire
Dans un projet, ils ont appelé l'événement RaiseEvent, en pensant qu'il fonctionnerait obligatoirement. Au cours des tests, ils ont découvert qu'en l'absence d'abonnés, il n'y avait aucun effet, ce qui a conduit à des malentendus dans la logique métier de l'application et des erreurs de reporting.