2008-10-30 7 views
1

j'ai fait une classe qui dérive de composants:Dispose d'exécution() avec classe dérivée de System.ComponentModel.Component

public class MyComponent: System.ComponentModel.Component 
{ 


} 

j'ai vu mettre Visual Studio ce code dans pour moi:

protected override void Dispose(bool disposing) 
{ 
    try 
    { 
     if (disposing && (components != null)) 
     { 
      components.Dispose(); 
     } 
    } 
    catch 
    { 
     throw; 
    } 
    finally 
    { 
     base.Dispose(disposing); 
    } 
} 

MyComponent a un membre qui est un DataSet et peut-être il y a d'autres membres qui implémentent IDisposable. Que dois-je modifier avec la méthode Dispose() pour m'assurer que les choses sont correctement nettoyées? Merci pour ton aide.

Répondre

1

Change:

if (disposing && (components != null)) 
{ 
    components.Dispose(); 
} 

être:

if (disposing && (components != null)) 
{ 
    _dataset.Dispose(); 
    components.Dispose(); 
} 
+0

Je ne suis pas sûr de ce qui définit les composants, mais vous voudriez jeter _dataset indépendamment du fait que les composants soient NULL. –

0

Vérifiez tous les objets membres jetables et les jeter si elles ne sont pas nulles.

0

je suis venu avec cette classe:

public class DisposableComponentWrapper : IComponent 
{ 
    private IDisposable disposable; 

    public DisposableComponentWrapper(IDisposable disposable) 
    { 
     this.disposable = disposable; 
    } 

    public DisposableComponentWrapper(IDisposable disposable, ISite site) 
     : this(disposable) 
    { 
     Site = site; 
    } 

    public void Dispose() 
    { 
     if (disposable != null) 
     { 
      disposable.Dispose(); 
     } 
     if (Disposed != null) 
     { 
      Disposed(this, EventArgs.Empty); 
     } 
    } 

    public ISite Site { get; set; } 

    public event EventHandler Disposed; 
} 

et méthode d'extension à IContainer:

public static void Add(this IContainer container, IDisposable disposableComponent) 
{ 
    var component = (disposableComponent as IComponent); 
    if(component == null) 
    { 
     component = new DisposableComponentWrapper(disposableComponent); 
    } 
    container.Add(component); 
} 

Ce qui pourrait aider ceux qui sont prêts à faire appel à leurs ressources disponibles formes.

Remarque: Je ne suis pas certain du comportement de IComponent.Disposed, MSDN ne dit pas grand-chose sur la façon dont il devrait être appelé dans la mise en œuvre de cette interface, la documentation ressemble à parler de code client à l'événement plus que quand il devrait être déclenché par des implémentations de cette interface.

Questions connexes