具有文字字符串的数组
本文关键字:数组 字符串 文字 | 更新日期: 2023-09-27 18:00:50
我有一个用文字字符串初始化的string
数组,如下所示:
public static void Main()
{
string[] values = new string[] { "Cat", "Dog", "Mouse", "Rat" };
}
因此,我们在堆栈和堆上有以下结构:
OnStack:一个变量values
,包含对堆上字符串数组的引用。
OnHeap:堆栈上values
引用的字符串数组
但是堆上数组的每个元素的内容是什么?
- 实际的字符串文字
- 引用指向实习生池中的字符串文字
编辑:该问题被指出与此问题重复。但我的情况与不同
- 另一个问题是作为数组元素的值类型的行为,这表明问题的提出者不清楚ref/val类型对象是如何在堆栈/堆上分配的
- 在我的问题中,我很清楚ref/val类型的元素是如何在堆栈或堆上分配的,但我正在讨论对象是字符串文字时的特殊情况。因为这必须涉及实习生库和GC
在这种特殊情况下,考虑到Microsoft.NET CLR(如果在堆栈或堆中,这只对values
的位置很重要(,您将有5个对5个对象的引用。
确切地说,您有一个string
s(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