在方法调用前面加 "~" 是什么意思?

12

我正在做一个示例,看到了这个...

#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

我尝试通过谷歌搜索但没有找到任何结果... 我只是想知道它的意思。 有人知道吗?

谢谢


1
可能是在C#中波浪符号(~)的含义是什么?的重复。 - BlueRaja - Danny Pflughoeft
1
你应该接受对你问题的回答。 - SLaks
这个回答解决了你的问题吗?在C#中,函数名前面的波浪线代表什么意思? - Jacob Stamm
4个回答

9
这是ViewModelBase类的终结器,垃圾回收器在回收之前调用它。
但实际上,它并不是非常有用,因为:
a)垃圾回收确实有效,您无需测试它。
b)当在正常执行期间调用它时,此方法对代码没有任何提示作用,因为大多数情况下,垃圾回收器只在确定存在内存压力时才进行收集。
大多数情况下不用担心垃圾回收器,只有在真正出现问题时才需要关注它。
此外,经验告诉我们,避免使用终结器,因为你永远不确定程序的其余部分在它被调用时处于什么状态。

9

这被称为终结器

垃圾回收器在对象被收集时,在GC线程上的某个不确定时间调用它。

它们也会对性能产生影响。

通常情况下,您永远不会编写终结器。
终结器由直接拥有本机资源的类使用(除非它们使用SafeHandles,这是应该的),以及用于特殊的调试技巧。


4

这是一个终结器(由垃圾回收器调用的特殊方法)。终结器旨在处理实现IDisposable接口类型所拥有的非托管资源,即使它的Dispose()方法从未被调用。

该类的作者写入调试代码的原因不是很清楚,但这种调试代码通常只是一种提醒:“嘿,笨蛋,你忘记手动调用Dispose()了”。虽然我自己不使用,但这是一种相当常见的调试辅助工具(我在很多代码中都看到过)。

有时候,一个类型的实例持有宝贵的资源,你需要在完成使用后立即调用Dispose()。作者的代码的作用是说:“如果我到达这个终结器,你没有尽快调用Dispose()。”不过,在生产代码中并不会真正使用终结器来实现这个功能。


听起来他正在使用它进行终身跟踪。 - SLaks
我认为你是正确的。如果类型不是IDisposable并且不持有宝贵的资源,那么似乎这是相当无意义的调试代码。我几乎每次看到人们添加#if DEBUG终结器都是为了确保终结器永远不会运行(在手动处理时应该被抑制以避免性能损失)。我知道你知道这些东西,只是为了对感兴趣的人进行解释 :) - Mark Simpson

0

https://dev59.com/KHVC5IYBdhLWcg3wxEN1#188715 - hunter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接