这是一个相当基本的问题,但是我仍在努力解决。

当您要允许对象的用户在最终对其进行垃圾回收之前释放其基础资源(例如套接字等)时,将实现IDisposable。

当我有一个包含DbConnection(实现IDisposable)的类时,我的类也需要实现IDisposable并将调用链接到DbConnection或它拥有的任何其他IDisposable对象吗?否则,只有当我的类是GarbageCollected时,才会释放DbConnections资源,从而删除它对连接的引用,并且GC将最终确定DbConnection。

最佳答案

是的,如果您控制一次性对象,则总是实现IDisposable。 总是。如果不这样做,您的代码将不会中断,但如果您不这样做,它将破坏拥有可抛弃对象的目的。

GC优化的一般规则是:

  • 任何控制不受GC管理的对象的类都必须实现终结器(通常也应实现IDisposable)。这是“顶级”一次性类通常来自的地方-它们通常控制到窗口,套接字,互斥对象或您拥有的东西的HANDLE。
  • 实例化IDisposable成员的任何类都应自己实现IDisposable,并适当地对其组成部分进行Dispose()。
  • 实例化IDisposeable对象的任何函数在使用完后都应正确地将其Dispose()删除。不要让它超出范围。

  • 如果您为自己编写应用程序,则可能会弯腰或忽略这些规则,但是在将代码分发给其他人时,您应该专业并且遵守这些规则。

    这里的逻辑是,当您在GC View 之外控制内存时,GC引擎无法正确管理您的内存使用情况。例如,在您的.NET堆上,您可能只有4个字节的指针,但是在非托管区域中,您可能会指向200 MB的内存。在您发现几十个引擎之前,GC引擎不会尝试收集它们,因为它所看到的只有几个字节。而在现实世界中,它看起来很像是内存泄漏。

    因此,规则是,非托管内存使用完毕后应立即释放(IDisposable链为您完成此操作),而GC引擎在处理完托管内存时立即将其释放。

    关于c# - IDisposable是否应级联应用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1461557/

    10-13 03:11