gpt4 book ai didi

c# - 应该级联应用 IDisposable 吗?

转载 作者:可可西里 更新时间:2023-11-01 07:53:40 26 4
gpt4 key购买 nike

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

IDisposable 被实现,当你想让一个对象的用户在对象最终被垃圾收集之前释放底层资源(例如套接字等)。

当我有一个包含 DbConnection(实现 IDisposable)的类时,我的类是否也需要实现 IDisposable 并链接调用到 DbConnection 或它拥有的任何其他 IDisposable 对象?否则,DbConnections 资源只会在我的类被垃圾回收时释放,从而丢弃它对连接的引用,GC 将最终确定 DbConnection

最佳答案

是的,如果您控制一次性对象,您总是实现 IDisposable。 总是。如果你不这样做,你的代码就不会中断,但如果你不这样做,它就违背了拥有一次性对象的目的。

GC 优化的一般规则是:

  • 任何控制不受 GC 管理的对象的类都必须实现终结器(并且通常也应该实现 IDisposable)。这通常是“顶级”一次性类的来源——它们通常控制窗口、套接字、互斥锁或其他任何东西的句柄。
  • 任何实例化 IDisposable 成员的类都应该实现 IDisposable 本身,并正确地 Dispose() 其成员。
  • 任何实例化 IDisposeable 对象的函数在使用完毕后都应该正确地对其进行 Dispose()。不要让它超出范围。

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

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

因此,规则是,非托管内存在您使用完后应立即释放(IDisposable 链会为您执行此操作),而托管内存会在 GC 引擎到达它时被释放。

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

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