gpt4 book ai didi

C#如何实现Dispose方法

转载 作者:IT王子 更新时间:2023-10-29 04:11:12 31 4
gpt4 key购买 nike

我需要一些关于 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com