我正在研究一个例子,我看到了......
#if DEBUG
/// <summary>
/// Useful for ensuring that ViewModel objects are properly garbage collected.
/// </summary>
~ViewModelBase()
{
string msg = string.Format("{0} ({1}) ({2}) Finalized", this.GetType().Name, this.DisplayName, this.GetHashCode());
System.Diagnostics.Debug.WriteLine(msg);
}
#endif
我尝试使用谷歌但却无法获得任何结果......我只是想知道这意味着什么。谁知道?
由于
答案 0 :(得分:7)
这称为finalizer。
垃圾收集器在收集对象的不确定时刻在GC线程上调用它。
他们的表现也很受欢迎。
一般来说,你永远不会写一个终结者 终结器由直接拥有本机资源的类使用(除非他们使用SafeHandles,他们应该使用),以及特殊的调试技巧。
答案 1 :(得分:6)
它是ViewModelBase类的终结器。它在收集之前由垃圾收集器调用。
这不是非常有用,因为:
a)垃圾收集确实有效,您无需进行测试。
b)在正常执行期间调用此代码时,它不会告诉您任何代码,因为在大多数情况下,垃圾收集器只执行自己的操作并在确定存在内存压力时收集。
在大多数情况下,可以不担心垃圾收集器 - 只有在遇到真正的问题时才会担心。
另外经验告诉我 - 避免使用终结器,因为你永远不知道你的程序的其余部分在被调用时会处于什么状态。
答案 2 :(得分:2)
它是一个终结器(一种由垃圾收集器调用的特殊方法)。终结器旨在处理实现IDisposable
的类型所拥有的非托管资源,即使从未调用其Dispose()
方法。
这个类的作者写道调试代码不是100%清楚的原因,但这样的调试代码通常只是说“嘿假,你忘了手动调用Dispose()
”。这是一个相当常见的调试辅助工具(我已经在相当多的代码中看到过它),尽管我自己并没有使用它。
有时一个类型的实例拥有宝贵的资源,一旦你完成它就调用Dispose()符合你的兴趣。作者的代码所做的是说“如果我到达这个Finalizer,你就不能尽快调用Dispose()。”但是,这并不是你在生产代码中使用Finalizer的原因。
答案 3 :(得分:0)
哦,呃,我发现它就像我发布后的两秒钟......这是一个破坏 - 或者。 http://www.csharp-station.com/Tutorials/Lesson07.aspx