C#如何实现Dispose方法

标签 c# dispose

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

相关文章:

c# - 将整个对象转储到 C# 中的日志的最佳方法是什么?

c# - IDisposable 有什么用?

在最后一个窗口调用 dispose 后 java swing 程序没有关闭

c# - 带有大量尾随空格的 Visual Studio 2015 代码片段

c# - 将 VB 转换为 C# - My.Application.Info.DirectoryPath

c# - MVVM基金会: Why return ICommand when its defined as RelayCommand

c# - "... an error occured while updating the object context. The ObjectContext might be in an inconsistent state...."

.net - 我需要处理任务吗?

VB.NET - 实现 IDisposable 时是否应该添加 Finalize 方法?

c# - 终结器和处置