我想知道如何调用这些函数的顺序。就像我们的堆已满,将调用GC。它将标记对象并调用其finalize操作,现在我们有扫描阶段..其中删除对该对象的引用并且对象变得不可访问.. 那么破坏在哪里循环......当它被称为它时......那么它会做什么......
答案 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)
有许多文档可以解释.NET垃圾收集器的工作原理。以下是一些开头:
http://msdn.microsoft.com/en-us/magazine/bb985010.aspx
http://msdn.microsoft.com/en-us/library/ms973837.aspx
http://www.simple-talk.com/dotnet/.net-framework/understanding-garbage-collection-in-.net/
答案 3 :(得分:1)
关于.Net内存管理的非常好的视频是.Net Memory Management。它将有助于清除您对终结器的疑虑以及何时调用它,如何调用它等等。