2010-02-24 6 views
1

Est-il nécessaire de définir sur Nothing (dans Dispose()) tous les champs WithEvents? Un mot clé ajoute des gestionnaires à de tels champs, mais ne les supprime pas tant que ce champ n'est pas Nothing, ce qui peut générer des fuites de mémoire?!.Rien, avec les champs Evénements et les fuites de mémoire

Cela devrait être particulièrement réelle sur des cas comme

class Foo 
{ 
    Private WithEvents _bar as Bar 

    Public Sub New(ByVal bar as Bar) 
     _bar = bar 
    End Sub 

    Private Sub Bar_Changed(ByVal sender as Object, _ 
     ByVal e as EventArgs) Handles _bar.Changed 
    '... ' 
    End Sub 
} 

Répondre

3

Cela peut générer des fuites de mémoire si l'objet auquel vous êtes abonné vit plus longtemps que l'abonné. Dans la majorité des cas, ce n'est pas vrai.

Prenez WinForms par exemple. Généralement, vous voyez le modificateur WithEvents sur les contrôles dans une application WinForm. La classe externe Form s'abonne et réagit à ces événements. Cela ne provoque pas de fuite de mémoire, car l'objet auquel vous êtes abonné, les instances Control, a à peu près la même durée de vie que l'abonné, le Form.

Dans le cas où les durées de vie diffèrent, alors oui, définir le champ sur Nothing vous permettra de vous désabonner de l'événement et d'éviter une éventuelle fuite de mémoire.

Questions connexes