Mat*_*ley 3 c# destructor idisposable finalizer
析构函数应该只释放对象所持有的非托管资源,并且不应该引用其他对象.如果您只有托管引用,则不需要(也不应该)实现析构函数.您希望这仅用于处理非托管资源.因为拥有析构函数需要一些成本,所以你应该只在消耗有价值的非托管资源的方法上实现它.
文章没有深入讨论这个问题,但在C#中使用析构函数会涉及哪些成本?
注意:我知道GC以及在可靠的时候没有调用析构函数的事实,除此之外,还有什么吗?
任何具有终结器的对象(我更喜欢该术语而非析构函数,以强调与C++析构函数的区别)都会添加到终结器队列中.这是一个对象的引用列表,这些对象具有在删除之前必须调用的终结器.
当对象用于垃圾收集时,GC将发现它在终结器队列中并将引用移动到可释放(f-reachable)队列.这是终结器后台线程依次调用每个对象的终结器方法的列表.
一旦调用了对象的终结器,该对象就不再位于终结器队列中,因此它只是GC可以删除的常规托管对象.
这意味着如果一个对象有一个终结器,它将至少存在一个垃圾收集,然后才能被删除.这通常意味着对象将被移动到下一个堆生成,这涉及实际将内存中的数据从一个堆移动到另一个堆.