类中的静态字段 - 是否为每个静态方法调用重新实例化?

时间:2010-04-22 15:11:18

标签: c# static garbage-collection

如果我有一个带有静态字段的静态类,例如:

private static myField = new myObject();

然后我有一堆使用myField的静态方法。

是否为每个方法调用重新实例化myField?我的猜测是它是第一次调用一个使用它的方法实例化它并保留在内存中直到GC清除它?

为任何指针干杯: - )

5 个答案:

答案 0 :(得分:7)

不,当首次访问该类时,它被分配给一次。应用程序运行时,GC不会释放此实例的内存 - 当AppDomain卸载时,内存将被释放。

答案 1 :(得分:1)

有一个article by Jon Skeet关于初始化和beforefieldinit标志。它解释了一些关于初始化和引用C#规范的重要部分的内容。

答案 2 :(得分:1)

它只被实例化一次。它是在您第一次使用静态方法时实例化的。 您也可以在静态construtor中实例化它。

答案 3 :(得分:1)

为给定的应用程序域运行一次静态字段初始值设定项,该字段在程序的生命周期内仍然可用。 CG不会收集静态成员变量引用的任何对象。

如果类具有静态构造函数,则静态字段初始化程序在该构造函数之前执行,这在第一次引用静态成员或执行实例构造函数时发生。如果没有静态构造函数,则在执行任何静态成员或实例构造函数之前,在某个未确定的时间初始化该字段。

答案 4 :(得分:0)

在类初始化期间仅分配一次。这种情况在第一次“积极”接触时有效地发生。有关何时初始化类的详细信息,请参阅:class initialization in JVM spec

假设此代码所在的类名为MyClass,myField将在加载MyClass的类加载器GCed后不久进行GC。 (类在所有主要JVM中以类加载器粒度卸载)。