正如标题所示,我感兴趣的是静态类在.NET中加载到内存中,尤其是C#.我认为这是类似于这一问题在Java和这个问题有关的静态方法,在加载它使用它的第一次.另外,一旦它在内存中,它会一直存在,直到应用程序终止,或者当垃圾收集器出现清理使用它的类时,它会被清理干净吗?
我意识到静态类使用的少量内存在具有8 + GB RAM标准的计算机世界中并不是非常重要,但了解内部结构总是很有趣.
编辑:
答案让我想要在这个问题上添加更多内容并通过一个例子来澄清.如果我理解正确,在下面的示例中,Contraption.SomeString将首先放在内存中,然后紧跟Contraption.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
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
关于静态字段初始化,很重要的一点是静态构造函数的使用。CLR 有一个类加载器组件,它加载类(元数据信息)并在程序中使用它们时向内存管理器请求内存分配。元数据加载是一次性工作,发布它只是根据需要请求内存
正如讨论中所理解的,静态类变量在类的第一次使用时在任何地方加载,并分配内存,但是使用静态构造函数可以确保它们在调用类加载器时首先被初始化,它的一次调用,可以对类中的所有静态变量进行初始化,这甚至可以先于第一个使用策略,因为它是在为给定程序加载 CLR (mscoree.dll) 组件时进行的。
静态构造函数在任何情况下都不会在第一次之后被调用(除了程序重新启动),即使有异常,它的使用也相当广泛,静态变量也可以通过将它们设置为来收集null