为什么MSDN提到需要重写Finalize()方法?

3
自从我第一次学习C#类以来,我就知道不仅不能显式调用类的Finalize()方法(它由垃圾回收器调用),而且我甚至不能在自定义类中实现它。让我有些困惑的是,在MSDN这样的地方中 - 默认情况下,Object.Finalize方法不执行任何操作。如果要在对象被回收内存之前让垃圾回收器执行清理操作,则必须在类中覆盖此方法。 我发现很多地方都建议使用其他方法。有人可以解释一下为什么吗?
1个回答

3
在同一MSDN页面中,您可以阅读到以下内容:
“在C#或C++编程语言中,您无法覆盖Finalize方法。在C#中,请使用析构函数语法来实现Finalize方法。在.NET Framework 2.0版本中,C++提供了自己的语法来实现Finalize方法,如Visual C++中的析构函数和终结器中所述。在早期版本中,C++使用析构函数语法来实现Finalize方法,就像C#一样。”
这意味着Finalize()方法是由垃圾回收器调用的,但它被析构函数的“友好”语法隐藏。您将写成ClassName.~ClassName()的内容将被编译器重写为ClassName.Finalize()
编辑 为了明确这一点,以下是在C#中实现finalizer的实际语法:
class MyClass
{
    ~MyClass()
    {
    }
}

通常情况下,您甚至不需要实现最终器方法(它甚至可能会影响性能),但您需要实现Dispose模式

好的,现在我感觉有点傻。我明白了 - 这份文档并不是特定于 C# 的。但是你真的可以使用 ClassName.~ClassName() 语法吗?我认为不行。 - atiyar
你将会编写 class Foo { public ~Foo() { ... }},我猜你无法以任何方式直接调用它。至少不能使用那种语法。 - Joey
@Nero 我写了 ClassName.~ClassName() 只是为了完全限定方法名,这不是你会写的东西(因为你无法编写 ClassName.Finalize())。 - Adriano Repetti
1
@Adriano:我已经理解了完全限定的事情。但是你能用任何语法在你的中调用析构函数吗?它不应该自动调用垃圾回收、using语法或应用程序域退出之一吗? - atiyar
1
@Nero 是的,您不能直接调用它。它将始终由 GC 调用,“using”只会调用 Dispose() 方法。 - Adriano Repetti

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