带有文字字符串的数组

时间:2015-07-02 07:14:12

标签: c# .net arrays string heap

我正在使用文字字符串初始化string数组,如下所示:

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

所以我们在Stack和Heap上有以下结构:

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

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

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

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

修改:该问题被指向与this question重复。但我的情况与

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

2 个答案:

答案 0 :(得分:2)

在这种特殊情况下,考虑到Microsoft .NET CLR(这对于class Student implements java.lang.Comparable<Student>{ // fields private String name; private int age; //Constructor public Student(String name, int age){ this.name = name; this.age = age; } //Override compare public int compareTo(Student otherStudent){ if(this.age == otherStudent.age){ return 0; } else if(this.age < otherStudent.age){ return -1; } else{ return 1; } } //Override toString public String toString(){ return this.name + " " + this.age; } } 的位置很重要,如果在堆栈或堆中),您将有5个对象的5个引用。

准确地说,你有一个values s(1个对象)数组,它是对string(另外4个对象)的引用数组。

五个参考文献是:

  • string(在这种情况下在堆栈中)
  • 4x引用4x实习values s(包含在堆上,string数组中)

五个对象是:

  • 包含在堆
  • 中的string[]数组
  • 被拦截的4x string[]个对象,但它们仍然是完全成熟的string个,唯一的区别是GC不会释放它们(除非他们object已卸下)

所以它是

  

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

答案 1 :(得分:2)

与创建时完全相同:

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

并创建它的实例:

class MyArray instance = new MyArray();

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