为什么有些人在Finalize方法上使用该Dispose方法?
在什么情况下你会使用Finalize方法而不是Dispose方法,反之亦然?
IDisposable关于处理非托管资源的"标准完整" 实现有很多信息- 但实际上这种情况非常罕见(大多数资源已经被托管类包装).这个问题集中在更常见的"仅限托管资源"案例的IDisposable的最小实现上.
1:IDisposable下面的代码中的mimimal实现是否正确,是否存在问题?
2:是否有任何理由增加一个完整的标准IDisposable执行(Dispose(),Dispose(bool),Finalizer等)在最小的执行力度呈现的?
3:在这个极小的情况下,制作Dispose虚拟(因为我们没有提供Dispose(bool))是否可行/明智?
4:如果这个最小的实现被一个包含(在这种情况下是无用的)终结器的完整标准实现替换 - 这会改变GC处理对象的方式吗?有什么缺点吗?
5:示例包括Timer与事件处理程序,因为这些情况下,尤其重要的是不能错过的无法处理它们会保持对象活蹦乱跳(this在的情况下Timer,eventSource在事件处理程序的情况下),直到GC得到轮在释放他们是时候了.还有其他这样的例子吗?
class A : IDisposable {
private Timer timer;
public A(MyEventSource eventSource) {
eventSource += Handler
}
private void Handler(object source, EventArgs args) { ... }
public virtual void Dispose() {
timer.Dispose();
if (eventSource != null)
eventSource -= Handler;
}
}
class B : A, IDisposable {
private …Run Code Online (Sandbox Code Playgroud) 我们都知道System.IDisposable模式。在StackOverflow上已经描述了无数的时间:
Disposable模式建议仅在处置对象时才处置托管资源,而不是在完成过程中处置
您可以看到这是因为建议使用以下代码:
protected void Dispose(bool disposing)
{
if (disposing)
{
// Code to dispose the managed resources of the class
}
// Code to dispose the un-managed resources of the class
}
Run Code Online (Sandbox Code Playgroud)
我知道,只要我的班级具有实现System.IDisposable的(私有)成员,我的班级就应该实现System.IDisposable。如果布尔处理为true,则Dispose(bool)应调用私有成员的Dispose()。
如果在完成过程中调用Dispose,为什么会出现问题?那么,如果在完成过程中调用以下Dispose会导致问题呢?
protected void Dispose(bool disposing)
{
if (myDisposableObject != null)
{
myDisposableObject.Dispose();
myDisposableObject = null;
}
}
Run Code Online (Sandbox Code Playgroud)