差异b / w析构函数和finalize方法

时间:2010-02-14 15:37:29

标签: c# object destructor finalize

我想知道如何调用这些函数的顺序。就像我们的堆已满,将调用GC。它将标记对象并调用其finalize操作,现在我们有扫描阶段..其中删除对该对象的引用并且对象变得不可访问.. 那么破坏在哪里循环......当它被称为它时......那么它会做什么......

4 个答案:

答案 0 :(得分:2)

在C#/ .NET中没有“析构函数”,尽管这个术语在过去似乎与“终结者”可以互换使用。

大多数时候,你也不应该实现终结者;你需要使用它们的主要实例是,如果类保留非托管资源,在这种情况下你应该实现IDisposable模式(从技术上讲,你可以将Dispose称为“析构函数”,但是它确实实际释放堆上的任何内存,这在讨论内存管理时是一个重要的区别。)

不要在内存管理方面猜测GC。只需确保释放您使用的任何非托管资源(文件句柄等)。如果你看到有人使用术语析构函数,他们可能会说终结者

答案 1 :(得分:2)

我必须推荐这个来源。来自C#编译器团队的Eric Lippert最近发表了关于这个问题的帖子:What’s the difference between a destructor and a finalizer?

从他们接受的定义来看,他们实际上是在C#中倒退。阅读他的帖子,我无法更好地描述它。

答案 2 :(得分:2)

答案 3 :(得分:1)

关于.Net内存管理的非常好的视频是.Net Memory Management。它将有助于清除您对终结器的疑虑以及何时调用它,如何调用它等等。