GC.KeepAlive
并不会实际做任何事情,它的目的是“欺骗”运行时,在方法开始和调用GC.KeepAlive
之间防止特定对象被垃圾回收。
任何方法调用都可以以这种方式保持对象存活:您可以将其传递给Console.WriteLine
,调用ToString
,甚至是GC.SuppressFinalize
。
(或者按照MSDN的说法:
)KeepAlive方法不执行任何操作,也不产生除扩展作为参数传递的对象的生存期之外的任何副作用。
最近我的一位同事问了我这个问题,我在我的博客上发布了答案,还附有示例代码:
https://blog.stephencleary.com/2009/08/q-if-dispose-calls-suppressfinalize-is.html
您还可能对我其他的Disposable博客文章感兴趣,其中一篇探讨了何时需要SuppressFinalize或KeepAlive()。
只是好奇,什么情况下会出现问题?假设Dispose()方法已经超过了引用对象任何成员的点。最终器释放对象可能会出现什么问题?