c# - 我什么时候需要管理托管资源?

标签 c# design-patterns dispose

我一直在研究标准的 Dispose 模式,我只是想知道我需要写什么来释放托管资源?如果这些资源已经被“管理”,那么我肯定不需要做任何事情。

如果是这种情况,并且我的类不包含任何非托管资源(因此不需要由 GC 完成),那么我是否只需要在我的 Dispose 方法中取消完成? :-

public void Dispose()
{
   GC.SuppressFinalize(this);
}

假设这是我的类(class):

public sealed class MyClass : IDisposable
{
    IList<MyObject> objects; // MyObject doesn't hold any unmanaged resource
    private bool _disposed;

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    private void Dispose(bool disposing)
    {
        if (!_disposed)
        {  
            // do I need to set the list to null and 
            // call Dispose on each item in the list?
            if (disposing)
            {
                foreach (var o in objects)
                    o.Dispose();

                objects = null;
            }
        }

        _disposed = true;
    }

    ~MyClass()
    {
        Dispose(false);
    }
}

我真的需要在这里释放托管资源吗?

谢谢,

最佳答案

如果您的类拥有任何 IDisposable 实例,则您正在使用托管资源,因此您应该实现 IDisposable 以允许用户处置资源。您的 Dispose 方法应该在托管资源上调用 Dispose

至于释放托管内存,你不需要做任何事情。这是由 GC 处理的,但这是由 GC 处理的清理的唯一部分。托管和非托管资源必须由 Dispose 和/或终结器清理。

如果您不使用任何托管或非托管资源,则无需实现 IDisposable 或终结器。实现终结器实际上会影响类型的性能,因此除非需要,否则不要实现它。

关于c# - 我什么时候需要管理托管资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1425764/

相关文章:

ruby-on-rails - Ruby 委托(delegate)/代理

C# IDisposable 模式和抛出 ObjectDisposedException

.net - 在 Windows 窗体中添加和删除控件和内存使用

c# - 在没有 File.Copy() 的情况下将应用程序 dll 从一个系统发送到另一个系统

c# - "The ' ObjectContent `1' 类型无法序列化内容类型“application/json”的响应正文

java - 处理表行数据结构的最佳模式是什么?

c# - 为什么 Bitmap 会导致规则 CA2000,而 Image 不会?

c# - 检测服务器连接到的网络的名称

c# - 无法在 Visual Studio 2012 Ultimate SP1 x64 中创建或打开网站

php - 具有不同设计的两个数据库之间的映射