带文字字符串的数组
Array with literal strings
我有一个 string
数组,用如下文字字符串初始化:
public static void Main()
{
string[] values = new string[] { "Cat", "Dog", "Mouse", "Rat" };
}
所以我们在堆栈和堆上有以下结构:
OnStack: 一个变量 values
保存对堆上字符串数组的引用。
OnHeap:栈上values
引用的字符串数组
但是堆上数组的每个元素的内容是什么?
- Actual string literals ?
- References pointing to string literals in intern pool ?
编辑: 问题被指向 this question 重复。但我的情况在
方面有所不同
- 另一个问题是关于作为数组元素的值类型如何表现的上下文,这表明问题提出者不清楚如何在 stack/heap.
上分配 ref/val 类型对象。
- 在我的问题中,我很清楚 ref/val 类型元素是如何在堆栈或堆上分配的,但我正在讨论对象是字符串文字时的特殊情况。因为那要处理intern pool和GC。
在这种特殊情况下,考虑到 Microsoft .NET CLR(这仅对 values
的位置很重要,如果在堆栈或堆中),您将有 5 个对 5 个对象的引用。
准确地说,您有一个 string
的数组(1 个对象),即对 string
(另外 4 个对象)的引用数组。
五个参考文献是:
values
(在这种情况下在堆栈上)
- 4x 对 4x interned
string
s 的引用(包含在堆上,在 string[]
数组中)
五个对象是:
string[]
的数组,包含在堆 中
- 4x
string
个对象被拘留,但它们仍然是完全成熟的 object
s,唯一的区别是 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
我有一个 string
数组,用如下文字字符串初始化:
public static void Main()
{
string[] values = new string[] { "Cat", "Dog", "Mouse", "Rat" };
}
所以我们在堆栈和堆上有以下结构:
OnStack: 一个变量 values
保存对堆上字符串数组的引用。
OnHeap:栈上values
引用的字符串数组
但是堆上数组的每个元素的内容是什么?
- Actual string literals ?
- References pointing to string literals in intern pool ?
编辑: 问题被指向 this question 重复。但我的情况在
方面有所不同- 另一个问题是关于作为数组元素的值类型如何表现的上下文,这表明问题提出者不清楚如何在 stack/heap. 上分配 ref/val 类型对象。
- 在我的问题中,我很清楚 ref/val 类型元素是如何在堆栈或堆上分配的,但我正在讨论对象是字符串文字时的特殊情况。因为那要处理intern pool和GC。
在这种特殊情况下,考虑到 Microsoft .NET CLR(这仅对 values
的位置很重要,如果在堆栈或堆中),您将有 5 个对 5 个对象的引用。
准确地说,您有一个 string
的数组(1 个对象),即对 string
(另外 4 个对象)的引用数组。
五个参考文献是:
values
(在这种情况下在堆栈上)- 4x 对 4x interned
string
s 的引用(包含在堆上,在string[]
数组中)
五个对象是:
string[]
的数组,包含在堆 中
- 4x
string
个对象被拘留,但它们仍然是完全成熟的object
s,唯一的区别是 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