静态类何时在.NET加载到内存中



正如标题所示,我对中何时将静态类加载到内存中感兴趣。NET,尤其是C#。我认为它类似于Java中的这个问题和关于静态方法的这个问题,因为它是在第一次使用时加载的。此外,一旦它在内存中,它会一直呆在那里直到应用程序终止,还是在垃圾收集器来清理使用它的类时被清理?

我意识到,在一个拥有8+GB RAM标准的计算机世界里,静态类使用的少量内存并不重要,但了解其内部总是很有趣的。

编辑:

这些答案让我想对这个问题补充更多,并用一个例子来澄清。如果我理解正确的话,在下面的例子中。SomeString将首先放在内存中,紧接着是Contraction。第一次通过循环的AnotherString。

public static class Contraption
{
public static string SomeString = "Some String";
public static string AnotherString = "Another String";
}
public class Processor
{
public void Process(List<SomeClass> items)
{
foreach(var item in items)
{
if(item.Name == Contraption.SomeString)
{
//do something
}
if(item.Name == Contraption.AnotherString)
{
//do something
}
}
}
}

关于静态字段初始化,一个重要的点是静态构造函数的使用。CLR有一个类加载器组件,该组件加载类(元数据信息),并在程序中使用时从内存管理器请求内存分配。元数据加载是一次性工作,发布后只需根据需要请求内存

正如在讨论中所理解的,静态类变量在类的第一次使用时加载到任何地方,并被分配内存,但使用静态构造函数可以确保它们在调用类加载器时被初始化为第一件事,它是一个一次性调用,可以对类中的所有静态变量进行初始化,这甚至在第一次使用策略之前,当CLR(mscoree.dll)为给定程序加载组件时。

在任何情况下(除了程序重新启动),静态构造函数在第一次调用后都不会被调用,即使出现异常,它也被广泛使用,静态变量也可以通过设置为null来收集

我假设您指的是静态类中的字段(或非静态类中静态字段)。它们将在首次使用之前进行初始化。它在C#规范中有描述:

10.4.5.1静态字段初始化

类的静态字段变量初始值设定项对应于一系列赋值,这些赋值按照它们在类声明中出现的文本顺序执行。如果类中存在静态构造函数(第10.11节),则在执行该静态构造函数之前立即执行静态字段初始值设定项。否则,在第一次使用该类的静态字段之前,静态字段初始化程序将在依赖于实现的时间执行。

静态类成员被认为是垃圾回收根,并且所有成员始终可访问。

您可以通过将静态成员重置为null或其他对象来强制回收对象:

public static class Foo 
{
public static object Bar = new object();
}
// somewhere later
Foo.Bar = null;
// the object can be collected now.

静态变量在AppDomain的生存期内持续存在,并且在中。NET,每个应用程序可以有多个AppDoamin。尽管大多数时候,每个应用程序只有一个AppDomain,而其他AppDomain大多是为沙盒插件创建的。

https://msdn.microsoft.com/en-us/library/2bh4z9hs(v=vs.110).aspx

最新更新