当类包含静态字段时,是否会调用C#类析构函数?

时间:2017-01-26 18:20:20

标签: c# static finalizer

在以下代码中:

public sealed class Switch
{
    public static MyObj s_object = new MyObj();
    private readonly SomeObject m_object = new SomeObject();

    ~Switch()
    {
        m_object?.Dispose();
    }
}

public class Test()
{
    Test() 
    {
        Switch switch = new Switch();
        switch = null;
        ...
    }
}

当Test ctor执行时,会创建一个新的Switch对象,然后立即设置为null。在某些时候,GC将处理它,在此过程中调用~Switch()析构函数。但是当一个类包含像s_object这样的静态字段并且调用应用程序尚未终止(app域仍然加载)时,会发生这种情况吗?静态对象在应用程序的生命周期内持续存在;这是否意味着包含它的非静态类也会?

2 个答案:

答案 0 :(得分:3)

这应该不是问题。静态字段在内存表示方面与定义类型的实例无关。

查看此帖子了解更多详细信息:How exactly do static fields work internally?

答案 1 :(得分:2)

当对象被垃圾收集(并因此最终确定)时,静态字段的存在对时间没有影响。该实例将在与没有静态场的情况下发生的时间相当的时候完成。

静态字段对实例的唯一影响是静态初始化在创建第一个实例之前发生,因此可能使第一个实例的创建比其余实例慢。

注意:帖子中的代码显示终结器的无效实现,因为它引用其他manged对象并尝试在其上调用方法。它导致两种情况的未定义行为(有/没有静态字段)。