带文字字符串的数组

Array with literal strings

我有一个 string 数组,用如下文字字符串初始化:

public static void Main()
{
     string[] values = new string[] { "Cat", "Dog", "Mouse", "Rat" };
}

所以我们在堆栈和堆上有以下结构:

OnStack: 一个变量 values 保存对堆上字符串数组的引用。

OnHeap:栈上values引用的字符串数组


但是堆上数组的每个元素的内容是什么?

  1. Actual string literals ?
  2. References pointing to string literals in intern pool ?

编辑: 问题被指向 this question 重复。但我的情况在

方面有所不同
  1. 另一个问题是关于作为数组元素的值类型如何表现的上下文,这表明问题提出者不清楚如何在 stack/heap.
  2. 上分配 ref/val 类型对象。
  3. 在我的问题中,我很清楚 ref/val 类型元素是如何在堆栈或堆上分配的,但我正在讨论对象是字符串文字时的特殊情况。因为那要处理intern pool和GC。

在这种特殊情况下,考虑到 Microsoft .NET CLR(这仅对 values 的位置很重要,如果在堆栈或堆中),您将有 5 个对 5 个对象的引用。

准确地说,您有一个 string 的数组(1 个对象),即对 string(另外 4 个对象)的引用数组。

五个参考文献是:

  • values(在这种情况下在堆栈上)
  • 4x 对 4x interned strings 的引用(包含在堆上,在 string[] 数组中)

五个对象是:

  • string[]的数组,包含在堆
  • 4x string 个对象被拘留,但它们仍然是完全成熟的 objects,唯一的区别是 GC 永远不会释放它们(除非它们的 AppDomain已卸载)

原来如此

References pointing to string literals in intern pool ?

这和你创建的完全一样:

class MyArray
{
     string first;
     string second; 
     string third;
     ... more strings
}

并创建它的实例:

class MyArray instance = new MyArray();

这将导致 MyArray 实例的内存分配,以及堆上相关字段的数量。它还创建指向此对象的引用和对所有相关字段的引用。与数组相同,只是您通过访问数组索引器来使用对字段的引用,而不是直接调用 instance.first