代码之家  ›  专栏  ›  技术社区  ›  Matt

使用从System.ComponentModel.Component派生的类实现Dispose()。

c#
  •  1
  • Matt  · 技术社区  · 16 年前

    我创建了一个从组件派生的类:

    public class MyComponent: System.ComponentModel.Component
    {
    
    
    }
    

    我看到Visual Studio为我输入了以下代码:

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

    MyComponent 有一个成员是 DataSet 也许还有其他一些成员 IDisposable . 如果有的话,我需要用 Dispose() 确保正确清理物品的方法?谢谢你的帮助。

    3 回复  |  直到 13 年前
        1
  •  1
  •   Nicholas Mancuso    16 年前

    变化:

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

    成为:

    if (disposing && (components != null))
    {
        _dataset.Dispose();
        components.Dispose();
    }
    
        2
  •  0
  •   Rune Grimstad    16 年前

    检查任何可释放的成员对象,如果不为空,则进行处理。

        3
  •  0
  •   smoothdeveloper    13 年前

    我想到了这门课:

    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;
    }
    

    以及对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);
    }
    

    这可能有助于那些愿意为自己的表格争取一次性资源的人。

    注意:我不确定iComponent的行为。已处理, MSDN 对于如何在这个接口的实现中调用它没有太多的说明,文档听起来像是在谈论注册到事件的客户机代码,而不是什么时候它应该由这个接口的实现触发。