具有文字字符串的数组

本文关键字:数组 字符串 文字 | 更新日期: 2023-09-27 18:00:50

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

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

因此,我们在堆栈和堆上有以下结构:

OnStack:一个变量values,包含对堆上字符串数组的引用。

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


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

  1. 实际的字符串文字
  2. 引用指向实习生池中的字符串文字

编辑:该问题被指出与此问题重复。但我的情况与不同

  1. 另一个问题是作为数组元素的值类型的行为,这表明问题的提出者不清楚ref/val类型对象是如何在堆栈/堆上分配的
  2. 在我的问题中,我很清楚ref/val类型的元素是如何在堆栈或堆上分配的,但我正在讨论对象是字符串文字时的特殊情况。因为这必须涉及实习生库和GC

具有文字字符串的数组

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

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

这五个参考文献是:

  • values(在这种情况下在堆栈上(
  • 对4个内部string的4次引用(包含在堆中的string[]数组中(

这五个对象是:

  • string[]的数组,包含在堆中
  • 4x个string对象,这些对象已被托管,但它们仍然是成熟的object对象,唯一的区别是GC永远不会释放它们(除非卸载它们的AppDomain(

所以它是

引用指向实习生池中的字符串文字?

这与创建完全相同

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

并创建它的实例:

class MyArray instance = new MyArray();

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