C# c如何处理静态成员的内存

C# c如何处理静态成员的内存,c#,memory-management,static-methods,static-classes,C#,Memory Management,Static Methods,Static Classes,做了很多搜索,但没有一个最终澄清我的疑问 当使用静态类或方法时,c何时为它们分配内存?那它到底有没有被解除分配呢 附加问题:什么时候应该使用静态成员或类 与所有类类型一样,静态类的类型信息在加载引用该类的程序时由.NET Framework公共语言运行库CLR加载。程序无法准确指定加载类的时间。但是,在程序中首次引用该类之前,它保证被加载并初始化其字段并调用其静态构造函数。静态构造函数只调用一次,并且静态类在程序所在的应用程序域的生命周期内一直保留在内存中 当使用静态类或方法时,c何时为它们分配

做了很多搜索,但没有一个最终澄清我的疑问

当使用静态类或方法时,c何时为它们分配内存?那它到底有没有被解除分配呢

附加问题:什么时候应该使用静态成员或类

与所有类类型一样,静态类的类型信息在加载引用该类的程序时由.NET Framework公共语言运行库CLR加载。程序无法准确指定加载类的时间。但是,在程序中首次引用该类之前,它保证被加载并初始化其字段并调用其静态构造函数。静态构造函数只调用一次,并且静态类在程序所在的应用程序域的生命周期内一直保留在内存中

当使用静态类或方法时,c何时为它们分配内存

分配内存的不是C,而是底层CLR。您还应该区分内存分配和成员的实际初始化

当程序EXE、DLL加载到内存中时,可能会发生内存分配。这是因为在“典型”实现中,静态数据成员分配在所谓的数据段上。这是一个固定的内存部分,专用于从运行时透视数据结构中保存永久数据。然而,一个特定的实现可能会有点不同,即使它必须是某种静态数据段,至少包含指向其他数据结构的指针

初始化发生在第一次访问类之前

那它到底有没有被解除分配呢

不,它们是静态的

附加问题:什么时候应该使用静态成员或类


旁注:这不是一个额外的问题,而是一个结束问题的原因,主要是基于观点。

关于该类的首次使用。它不会被释放。另外一个问题是:在需要静态成员或类的时候使用静态成员或类。它很可能在编译时分配内存。但这实际上是一个实现细节,不需要担心。你想解决什么问题?这有什么关系?@CodyGray编译程序时,你不能为程序分配内存……当然可以,@servy。信息被放置在二进制图像.data/.bss部分的静态数据区域中。这种分配发生在编译时。编译器在链接器的配合下为该数据分配空间,并知道其地址。我不知道你是不是想指出,二进制图像在加载时必须映射到内存中,所以实际上是由加载程序执行分配?虽然这肯定是一个有效的透视图,但运行时也不会分配动态内存,这是事实:OS VMM会分配动态内存。谢谢你Ondrej!帮了我很多忙。