【发布时间】:2015-08-02 19:58:58
【问题描述】:
我知道c#中的析构函数没有执行顺序。
我在几个类中使用了以下结构,它用于破坏实例和静态信息:
public class MyClass
{
private static readonly Destructor DestructorObject = new Destructor();
~MyClass()
{
Console.WriteLine("Destructor Called");
}
static void Main(string[] args)
{
var myClass = new MyClass();
}
private sealed class Destructor
{
~Destructor()
{
Console.WriteLine("Static Destructor Called");
}
}
}
正如我上面提到的,析构函数的顺序是未定义的。但是当我在许多类中使用这个结构时,我发现,在每个类中都有一个不变的顺序,即使我重新编译应用程序并再次运行它,它也仍然存在。
意味着MyClass1 始终可以先运行~MyClass1,而另一个类MyClass2 可以始终先运行~Destructor。
显然每个班级都有一个“隐藏”的顺序,我可以相信它吗?
【问题讨论】:
-
C# 没有析构函数。您正在描述终结器。它们会减慢垃圾收集速度,从而减慢您的应用程序。因此,它们只应在边缘情况下使用,例如确保尽快释放非托管资源,并且仅在无法使用确定性
IDisposable解决方案时。 -
@DavidArno 是的,they do。当然这只是命名语义,但仍然......
-
@YuvalItzchakov 他们是终结者。这是一个误称。也许设计团队在他们将其命名为析构函数时在酒吧:p
-
@SriramSakthivel 由于 C 和 C++ 执行析构函数的方式,人们避免称它们为析构函数,但无论如何;)
-
@YuvalItzchakov 你可能对eric's article感兴趣
标签: c# destructor