我应该何时实施IDisposable?

这个问题在这里已经有了答案:

  • 正确使用IDisposable接口18的答案

  • 如果您的意思是非托管对象,那么您应该在您有一个或多个您的班级处理的非托管资源时实施它。 当你可能持有IDisposable本身的对象时,你也应该使用这个模式,并且确保在你的类被丢弃时处置它们。

    (同意这个问题已经被问及足够多的时间,以便在打印的时候使用小墨盒来打印小墨盒...)


    虽然每个人都提到(非托管)资源,但我还有一件事要补充:当我需要消除事件处理程序连接时,我会使用它,否则会阻止班级超出范围并被垃圾收集。

    作为一个例子,我有一个服务被注入到子视图,该子视图将订阅服务上的各种异步完成类型事件。 该子视图的所有者不知道具体类型是什么,它只是将其作为一个接口。 这项服务可能会在未来某个任意时间点超出范围,我不希望它在未被GC检查的情况下徘徊。 在摆脱那个子视图后,主人会调用Dispose来让它有机会解开任何事件处理程序。 这里有一个稍微有点人为的(和非常伪代码)的例子,请注意子视图的接口如何实现IDisposable

    public class OwnerView {
    
        public OwnerView() {
            _childView = new ChildView(myServiceReference);
        }
    
        public void CloseChildView() {
            if (childView != null) {
                _childView.Close();
                _childView.Dispose();
            }
    
            _childView = null;
        }
    
        private IChildView _childView;
    }
    
    public class ChildView : IChildView {
    
        public ChildView(MyService serviceRef) {
            _serviceRef = serviceRef;
            _serviceRef.GetSettingsAsyncFinished += new EventHandler(someEventHandler);
        }
    
        public void IDisposable.Dispose() {
            _serviceRef -= someEventHandler;
        }
    
        private MyService _serviceRef;
    }
    
    public interface IChildView : IDisposable {
        void DoSomething();
        ... etc ...
    }
    

    关于SO的其他更多关于这个的权威评论,就像Do事件处理程序阻止垃圾回收发生一样? 垃圾收集时使用匿名代理进行事件处理。 你可能也想看看这个codeproject文章。


    当您的课程在您完成使用时持有您想要释放的资源时,您应该实施IDisposable。

    链接地址: http://www.djcxy.com/p/54465.html

    上一篇: When should I implement IDisposable?

    下一篇: Referencing an object outside of using() block