c# - 为什么是 "Finalize method should not reference any other objects"?

标签 c# garbage-collection clr dispose finalizer

我一直在思考为什么建议我们不要在finalize中释放托管资源。 如果您在 http://msdn.microsoft.com/en-us/library/system.gc.suppressfinalize.aspx 看到代码示例,然后搜索字符串“Dispose(bool disposing) executes in two distinct scenarios”并阅读该评论,您就会明白我的意思。

我能想到的唯一可能性是,它可能与无法预测何时调用终结器这一事实有关。 有谁知道正确答案吗?

谢谢, 米沙尔

最佳答案

如果您从终结器中引用另一个对象,您不知道那个对象是否已经被终结 - 以及如果它被终结将如何表现. (我不知道当前是否有任何 CLR 运行多个终结器线程,但另一种可怕的可能性是当你的终结器运行时它正在被终结。)

您在终结器中需要做的就是释放您直接拥有的非托管资源。如果您要引用其他拥有资源的托管类型,请让它们在它们的终结器中完成它们的工作。

关于c# - 为什么是 "Finalize method should not reference any other objects"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2688636/

相关文章:

c# - 创建 BlobClient 会导致发布配置中的 System.Diagnostics.DiagnosticSource Version=4.0.4.0 FileNotFoundException

c# - C#事件处理是如何实现的?

c# - 循环迭代器偏移量

java - 为什么 JVM 只有在使用 CMS 垃圾收集器时才会随着时间的推移而变慢?

java - 使用收集器使用临时变量

c# - C#方法中的静态参数

c# - 深层日期列表的 linq 帮助

c# - 在只有 4.0 框架的机器上引用 2.0 库运行 .NET 4.0 应用程序

c++ - 不能包含 cliext header (对于 c++ cli、Visual Studio)

.net - 依靠.NET自动垃圾收集器是一种不好的做法吗?