2009-11-10 7 views
3

En C#, j'ai pris l'habitude d'effacer tous les abonnements à mes événements personnalisés en Dispose() pour éviter les fuites de mémoire des abonnés oubliant de se désabonner de mes événements.Est-il possible de supprimer un abonnement à un événement dans VB.NET?

C'était très simple à faire, simplement en appelant MyEvent = null puisque le compilateur C# génère automatiquement un champ délégué. Malheureusement, dans VB.NET, il semble y avoir aucun moyen simple de le faire. La seule solution que j'ai trouvé était d'écrire un Custom Event, en ajoutant des gestionnaires d'ajout et de suppression personnalisés appelant Delegate.Combine/Delegate.Remove, essentiellement ce que fait le compilateur C#. Mais avoir à le faire pour chaque événement juste pour pouvoir effacer les abonnements me semble un peu «exagéré».

Est-ce que quelqu'un a une autre idée pour résoudre ce problème? Merci.

Répondre

5

C'est exactement la même chose dans VB.Net. Le compilateur automatically creates a delegate field pour chaque événement, tout comme le compilateur C#, mais dans VB le champ est caché. Cependant, vous pouvez accéder à la variable à partir de votre code - il est toujours nommé XXXEvent, où XXX est le nom de l'événement.

Ainsi, vous pouvez facilement les abonnements claires à l'événement, tout comme en C#:

Public Class Class1 
    Implements IDisposable 
    Event MyEvent() 

    Sub Clear() Implements IDisposable.Dispose 
    Me.MyEventEvent = Nothing ' clear the hidden variable ' 
    End Sub 
End Class 

Je pense aussi qu'il devrait être possible d'utiliser la réflexion pour trouver automatiquement toutes les variables de délégués cachés, et les effacer . Ensuite, ils ne doivent pas être répertoriés dans la méthode Clear. AddHandler/RemoveHandler est l'équivalent VB.NET de + = et - = en C#

+0

Merci! Je n'ai pas vu cette section de la documentation, très utile. En utilisant la réflexion, cela semble assez lourd juste pour mettre certaines variables à zéro; mais très utile pour affirmer au débogage que chaque champ était correctement défini sur null. –

+0

Je pensais qu'il pourrait y avoir une méthode générique ClearAllSubscriptions qui utilise la réflexion pour traiter n'importe quel type: alors tout ce dont vous avez besoin dans votre méthode Clear est 'ClearAllSubscriptions Me' – MarkJ

0

Je n'ai qu'une vague connaissance de VB.NET, mais qu'en est-il de AddHandler/RemoveHandler?

+0

Comme je ne connais pas tous les abonnés (à moins que je ne fasse l'événement personnalisé), je ne peux pas les supprimer tous. –