2010-10-15 12 views
1

La syntaxe "WithEvents" de vb.net est très utile, mais si un champ WithEvents faisant référence à un objet de longue durée n'est pas annulé, il constituera souvent une fuite de mémoire.Un moyen d'effacer tous les champs WithEvents via une commande?

Y a-t-il un moyen simple pour qu'une routine Dispose vb.net vider automatiquement tous les champs WithEvents et les désinscrire?

J'ai trouvé un moyen agréable d'envelopper la création de champs jetables afin qu'ils soient automatiquement éliminés lorsque l'objet conteneur est éliminé, sans avoir à lister individuellement ces objets. Est-il possible de prendre en charge les champs WithEvents sans les annuler manuellement dans la routine Dispose?

EDIT Comme il n'y avait pas de réponse indiquant une manière intégrée pour le faire sans réflexion, est-il des moyens intégrés d'utiliser la réflexion pour déterminer si un bien est une VB mise en œuvre automatique d'un WithEvents " champ"? Je sais qu'un "champ" WithEvents appelé "foo" est implémenté comme une propriété appelée "foo" et un champ appelé "_foo", mais c'est un schéma de nommage si commun que je ne compterais pas dessus. Y at-il un attribut qui pourrait être utilisé pour déterminer quelles propriétés doivent être auto-annulées?

Répondre

1

Cela peut être possible avec un peu de magie de réflexion. Mais il n'y a aucun moyen intrinsèque d'interroger les champs qui sont marqués avec WithEvents

+0

Bummer. Est-il possible d'avoir une méthode à la fois engager un abonnement à un événement et garder une référence à utiliser lors de la désinscription? Pour iDisposables, j'ai une fonction RAII générique qui ajoute un jetable à une liste et le renvoie. Lorsqu'un objet est éliminé, tous les iDisposalbles qu'il a ainsi enregistrés seront éliminés. Toute possibilité de faire de même avec les abonnements aux événements? – supercat