我需要一些关于 Dispose
方法实现的建议。
在我们的应用程序中,用户设计自己的 UI。我有一个预览窗口,显示 UI 的外观。在这个 UI 中绘制的所有对象最终都派生自一个公共(public)基类 ScreenObject。我的预览管理器包含对 ScreenGrid 的单个对象引用,它是整个预览区域的网格对象。
问题#1
我的一些派生屏幕类持有非托管资源,例如数据库连接、位图图像和 WebBrowser
控件。这些类需要处理这些对象。我在 ScreenObject
基类中创建了一个虚拟 Dispose
方法,然后在每个保持非托管的派生类中实现了一个覆盖 Dispose
方法资源。但是,现在我只是创建了一个名为 Dispose
的方法,我没有实现 IDisposable
。我应该实现 IDisposable
吗?如果可以,我该如何实现?
- 仅针对具有非托管资源的派生类
- 具有非托管资源的基类和派生类或
- 基类和所有派生类,包括那些没有非托管资源的派生类
将虚拟 Dispose
方法放在没有非托管资源的基类中以便您可以利用多态性是否错误?
问题 #2
在阅读有关 Dispose
方法和 IDisposable
接口(interface)的文章时,Microsoft 声明处置对象应该只为其父级调用 Dispose
方法。父级将为其父级调用它,依此类推。对我来说,这似乎倒退了。我可能想处置一个 child ,但保留其 parent 。
我认为应该反过来,一个被处置的对象应该处置它的 child 。然后 children 应该处理他们的 child 等等。
我是不是错了,还是遗漏了什么?
最佳答案
问题 1:同样使用以下模式实现 IDisposable
:
public class MyClass : IDisposable
{
bool disposed;
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
//dispose managed resources
}
}
//dispose unmanaged resources
disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
问题 2:Microsoft 的意思是派生类在其父类上调用 dispose。实例的所有者仅对最派生的类型调用 Dispose。
一个(简化的)例子:
class Parent : IDisposable
{
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
//dispose managed resources
}
}
//dispose unmanaged resources
disposed = true;
}
}
class Child : Parent, IDisposable
{
protected override void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
//dispose managed resources
}
base.Dispose(disposing);
}
//dispose unmanaged resources
disposed = true;
}
}
class Owner:IDisposable
{
Child child = new Child();
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
if(child!=null)
{
child.Dispose();
}
}
}
//dispose unmanaged ressources
disposed = true;
}
}
Owner 只对 Child 调用 Dispose
,不对 Parent 调用。子级负责调用父级的 Dispose
。
关于C#如何实现Dispose方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7485075/