Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET非/通用列表存储在堆栈或堆上?_C#_List_Generics - Fatal编程技术网

C# .NET非/通用列表存储在堆栈或堆上?

C# .NET非/通用列表存储在堆栈或堆上?,c#,list,generics,C#,List,Generics,我想知道的是,下面的列表存储在哪里,在堆栈上还是在堆上 值类型的非通用列表 int[] strArray = { 1, 2, 3 }; List<int> moreInts = new List<int>(); moreInts.Add(10); ref类型的非通用列表 Person[] personArray = new Person[1]; personArray[0] = new Person(); List<Person> morePeople

我想知道的是,下面的列表存储在哪里,在堆栈上还是在堆上

  • 值类型的非通用列表

    int[] strArray = { 1, 2, 3 };
    
    List<int> moreInts = new List<int>();
    moreInts.Add(10);
    
  • ref类型的非通用列表

    Person[] personArray = new Person[1];
    personArray[0] = new Person();
    
    List<Person> morePeople = new List<Person>();
    morePeople.Add(new Person ("Frank", "Black", 50));
    
  • 值类型的泛型列表

    int[] strArray = { 1, 2, 3 };
    
    List<int> moreInts = new List<int>();
    moreInts.Add(10);
    
    List moreInts=new List();
    增加(10);
    
  • ref类型的泛型列表

    Person[] personArray = new Person[1];
    personArray[0] = new Person();
    
    List<Person> morePeople = new List<Person>();
    morePeople.Add(new Person ("Frank", "Black", 50));
    
    List morePeople=new List();
    添加(新人物(“弗兰克”,“黑人”,50));
    
  • 字符串不是值类型
  • 数组不是值类型
  • 列表不是值类型(并且在内部使用数组)
  • 理论上,两者都可以存储在堆栈或堆上(或者完全不同的东西!),这不是规范的一部分。实际上,堆栈只用于范围内的事情,为了简化并确保引用在范围内,它通常只将值类型放在堆栈上,因为这些值类型很容易验证。但是,它们也可以存储在寄存器中。这取决于JIT编译器

    在不安全代码中,您可以显式地在堆栈上分配一些指针,但这只是在不安全代码中。除此之外,这取决于JIT编译器的实现。然而,对于当前的版本,您可以非常肯定的是,所有无法验证生命周期是否有足够的限制的内容都将被放在堆上。这里的关键是范围,而不是引用类型还是值类型。只是值类型通常很容易验证:)

    如果你不得不考虑它是在堆上还是在堆栈上,那么它很可能在堆上。无论如何,关键是“你不在乎”。只有当您有性能分析数据来支持您确实存在与此相关的问题时,才需要注意


    记住-堆栈、堆、寄存器。。。所有这些都只是.NET托管内存模型中的一个实现细节。

    Everbody。所有数组都存储在堆中。 如果数组类型为struct,则值存储在数组的单元格中。 在数组中列出安全值

    例如:

  • strArray有3个单元格,其中有3个指向堆中字符串的指针
  • personArray有1个单元格,其中1个指针指向堆中的Person类
  • moreInts有1个单元格,单元格中有1个整数值
  • morePeople在堆中有1个带有指向Person类指针的单元格
  • 1=非通用列表编号,它是引用类型的数组。2=引用类型的非通用列表否,它是引用类型的数组(假设
    Person
    类,而不是
    结构
    )。请阅读。