Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在方法调用前放置波浪线?_C# - Fatal编程技术网

C# 在方法调用前放置波浪线?

C# 在方法调用前放置波浪线?,c#,C#,我正在研究一个例子,我看到了这个 #if DEBUG /// <summary> /// Useful for ensuring that ViewModel objects are properly garbage collected. /// </summary> ~ViewModelBase() { string msg = string.Format("{0} ({1}) ({2}) Finalized",

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

#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
#如果调试
/// 
///用于确保ViewModel对象被正确垃圾收集。
/// 
~ViewModelBase()
{
string msg=string.Format(“{0}({1})({2})已完成”,this.GetType().Name,this.DisplayName,this.GetHashCode());
系统.诊断.调试.写线(msg);
}
#恩迪夫
我试着用谷歌搜索,但没有得到任何结果。。。我只是想知道这是什么意思。有人知道吗


谢谢

哦,是的,我在发布这篇文章两秒钟后发现的。。。这是一个自毁程序

它是ViewModelBase类的终结器。它在收集之前由垃圾收集器调用

它实际上不是很有用,因为:

a) 垃圾收集确实有效,您无需对其进行测试

b) 在正常执行过程中调用它时,它不会告诉您有关代码的任何信息,因为在大多数情况下,垃圾收集器只做自己的事情,并在确定内存压力时进行收集

在大多数情况下,不用担心垃圾收集器是可以的——只在您遇到真正的问题时才担心它

经验还告诉我-避免使用终结器,因为您永远不确定调用程序时程序的其余部分将处于什么状态

这称为一个

垃圾收集器在收集对象时的不确定时间点在GC线程上调用它

他们的表演也很成功

一般来说,您将永远不会编写终结器。
终结器由直接拥有本机资源的类使用(除非它们使用安全句柄,它们应该使用安全句柄),并用于特殊的调试技巧。

它是终结器(垃圾收集器调用的特殊方法)。终结器设计用于处置实现
IDisposable
的类型所拥有的非托管的资源,即使从未调用其
dispose()
方法

此类作者编写调试代码的原因并非100%清楚,但此类调试代码通常只是表示“嘿,dummy,你忘了手动调用
Dispose()
”。这是一个相当常见的调试辅助工具(我在很多代码中都见过),尽管我自己并不使用它


有时,某个类型的实例拥有宝贵的资源,在完成该实例后立即调用Dispose()符合您的利益。作者的代码所做的是说“如果我到达这个终结器,您就无法尽快调用Dispose()”。但是,这并不是您在生产代码中使用终结器的真正目的

你应该接受你问题的答案。这是否回答了你的问题?听起来他好像在用它来追踪生命。我想你是对的。如果类型不可IDisposable,并且不包含宝贵的资源,那么它看起来就像是毫无意义的调试代码。几乎每次我看到folk添加#if DEBUG finalizers是为了确保Finalizer永远不会运行(在手动处理时应该抑制它以避免性能命中)。我知道你知道这些,只是给感兴趣的人说:)