我应该何时实施IDisposable?
这个问题在这里已经有了答案:
如果您的意思是非托管对象,那么您应该在您有一个或多个您的班级处理的非托管资源时实施它。 当你可能持有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