Joh*_*lph 14 .net c# idisposable
这是一个相当基本的问题,但我仍然在努力解决它.
当您希望在对象最终被垃圾收集之前允许对象的用户释放底层资源(例如套接字等)时,实现IDisposable.
当我有一个持有DbConnection(实现IDisposable)的类时,我的类是否也需要实现IDisposable并将调用链接到DbConnection或它拥有的任何其他IDisposable对象?否则,只有当我的类是GarbageCollected时才会释放DbConnections资源,从而删除它对连接的引用,GC将完成DbConnection.
tyl*_*erl 10
是的,如果你控制一次性物品,你总是可以实现IDisposable.总是.如果你不这样做,你的代码就不会破坏,但如果不这样做,它就会失去拥有一次性物品的目的.
GC优化的一般规则是:
如果您为自己编写应用程序,可能会忽略或忽略这些规则,但在向其他人分发代码时,您应该专业并遵守规则.
这里的逻辑是,当您在GC视图之外控制内存时,GC引擎无法正确管理您的内存使用情况.例如,在.NET堆上,您可能只有一个4字节的指针,但在非托管的域中,您可以指向200 MB的内存.GC引擎在你有几十个之前不会尝试收集它们,因为它只看到几个字节; 而在现实世界中,它看起来很像内存泄漏.
因此,规则是,当您使用它时,非托管内存应立即释放(IDisposable链为您执行此操作),而GC引擎会随时释放托管内存.