c# - 终结器和析构函数,维基百科是怎么说的?

标签 c# destructor finalizer

据我所知,关于这个问题有两个阵营——第一个阵营认为终结器是特定于 C# 的析构函数。所以他们认为这两个东西是一样的。

第二个阵营认为存在细微差别 - 写在维基百科中 - “术语“析构函数”通常用于表示确定性调用的清理,而“终结器”在垃圾收集器要求运行时运行。”

但让我为自己澄清一些事情。确定性地调用清理?在 C# 规范和 msdn 中,写的是不能调用析构函数(它们是自动调用的)。唯一可以自动调用它们的情况是垃圾收集器。

所以我看不出确定性调用的清理与垃圾收集器的情况有任何区别。

是不是?

最佳答案

差别很大。 确定性地调用 意味着您知道它何时会被调用。

在 C++ 中:

{
    Person a;
    a.Name = "John";
    InvitePerson(a);
} // <-- Destructor is always invoked when the scope is left

在 C# 中:

{
    Person a = new Person();
    a.Name = "John";
    InvitePerson(a);
} // <-- The finalizer is NOT invoked when the scope is left

如前所述,主要区别在于:
在 C# 和其他垃圾收集语言中,您不知道何时甚至是否会执行终结器。
然而,在 C++ 中,您确实知道何时一旦对象超出范围就会执行析构函数。

关于c# - 终结器和析构函数,维基百科是怎么说的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5882729/

相关文章:

c# - 如何向 PropertyGrid 的 CollectionEditor 添加验证?

c# - Fluent NHibernate - HasMany 复合键

delphi - 在 aControl 内部调用 aControl.free

C++ 继承和 valgrind 内存泄漏

c# - 使用 ExtractToDirectory 方法解压缩会扭曲非拉丁符号

c# - 向集合添加元素的方法

C++:何时以及为何调用析构函数?

python - 在 Python 中正确完成

java - 使用终结器清理弱引用缓存?

java - 终结器对 JVM 的性能影响