在方法调用前放一个代字号?

时间:2011-01-20 01:40:33

标签: c#

我正在研究一个例子,我看到了......

#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

我尝试使用谷歌但却无法获得任何结果......我只是想知道这意味着什么。谁知道?

由于

4 个答案:

答案 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