在ILSpy中显示的奇怪类成员语法

8

我使用 ILSpy 检查了 XNA 框架中的一些 dll 文件,发现了以下内容:

class KerningHelper
{
    private void !KerningHelper()
    {
        ((IDisposable)this).Dispose();
    }
}

在上面的内容中,感叹号是用来表示什么的?这是与ILSpy有关还是其他问题?请注意,该类有一个单独的析构函数:private unsafe void ~KerningHelper()

2
在CLI/C++中,!KerningHelper代表的是finalizer而不是destructor,也许与此有关。在这里看一下:http://en.wikipedia.org/wiki/C%2B%2B/CLI#Finalizers_and_automatic_variables - Nick
1
无论如何,它都不是有效的C#代码,所以我猜测它是一些IL表示形式,然后被错误地转换回来了。 - Adam Houldsworth
@AdamHouldsworth:我已经尝试用自己的类来实现这个,并得出了相同的结论。我对它最初是什么、它的用途以及最初的语法很感兴趣。 :) - George Duckett
1个回答

7
正如评论所述,感叹号是C++/CLI标记最终器方法的符号。与传统的C++析构函数(~)在您明确处理对象时调用不同,垃圾回收线程会调用finalizers。您可以在此处查看官方详细信息:这里
我期望ILSpy将!KerningHelper()翻译为~KerningHelper(),因为C++/CLI finalizer等效于C#的析构函数-它是一种不确定性方法,当GC到达它时才会发生,而不像C++/CLI的显式~析构函数,后者在调用delete或进行显式Dispose调用时被调用。

谢谢解释,让我困惑的是KerningHelper也有一个析构函数,所以我猜ILSpy使用!来表示它与析构函数不同。如果您知道终结器的用途,我会很感激,因为在我找到的类中,我认为dispose应该被调用,所以我不明白它的用途(即何时会使用终结器而不是/以及析构函数?)。 - George Duckett

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