在C#中,可以初始化一个没有关键字“new”的数组,如下例所示:
int[] x = { 10, 20, 30 };
这是否意味着数组将在堆栈上初始化,因为关键字“new”是初始化堆上的东西所必需的?
答案 0 :(得分:5)
简短回答:不。
您展示的代码是int[] x = new [] { 10, 20, 30 }
的简写
这是int[] x = new int[] { 10, 20, 30}
的简写
这是int[] x = new int[3]; x[0] = 10; x[1] = 20; x[2] = 30;
(见MSDN)
实施没有区别。
在堆栈中分配数组的唯一方法是使用带有stackalloc
关键字的不安全代码,如注释中所指出的那样。
MSDN的示例:
int* block = stackalloc int[100];
答案 1 :(得分:0)
我想在此处添加更多内容。
堆栈中的内容是int数组的heapAddress。让 当你把那个数组传递给某个函数时,那你就是什么 传递的是来自Stack的heapAddress值。
答案 2 :(得分:-2)
生成的中间代码对于new和没有新的初始化是相同的。
示例代码:
public class Class1
{
int[] a = new int[4];
}
public class Class2
{
int[] a = { 1, 2, 3, 4 };
}
编译:
(因为我没有上传图片的必要点,你可以在ildasm中查看)