CLR:内存中const字符串值的生命周期是多少?

时间:2010-07-21 11:37:34

标签: c# string memory-management clr const

假设我们有一个包含10000个const字符串成员的类。

class Schema
{
  //Average string length is 20
  public const string ID1 = "some.constant.value";
  public const string ID2 = "some.other.constant.value";
  //...
}

并非所有字段都在其余代码中引用。只有10%的人在启动时被访问 - 他们的引用被指定为各种词典的密钥(数千个字典实例)。我理解const字符串是实例化的 - 多次引用const字符串不会增加消耗的内存量超过指向实习字符串表中偏移量的元数据标记的大小。

我知道const字符串被编译到程序集中,从而影响编译程序集的大小。


这些const字符串在什么时间/事件上消耗运行时内存?

所有所需的所有内存是在加载程序集时采用的const字符串还是延迟到该类是JIT编译的?

我们可以通过改变等式中的某些内容来减少启动后的内存消耗吗? (使字段非常量,使字符串成为静态字段?)。

让我们假设一个Winforms应用程序(.NET 2.0)。

3 个答案:

答案 0 :(得分:3)

Const字符串是编译时文字,由于CLR使用实际内容,因此只要应用程序处于活动状态,它们就会一直存在。

您也可以找到this question相关的答案。

答案 1 :(得分:0)

我可能错了,但是当首次引用程序集时,它完全被加载到内存中 包含所有代码,元数据和常量值(我不确定嵌入式资源是否也被加载或延迟)。并且它将一直加载,直到该过程终止

答案 2 :(得分:0)

字符串是常量并不重要。常量本身根本不占用任何内存,它是占用内存的文字字符串。

在代码中使用常量时,编译器会将其替换为对文字字符串的引用。

字符串文字随程序集一起加载,因此它们会在应用程序的整个生命周期内保持不变。即使您将常量更改为其他内容,字符串文字仍然存在。使用变量而不是常量实际上会使用更多的内存,因为它需要某处存储变量的值(即对文字字符串的引用的副本)。