2014-10-08 104 views
1

在C#它是可能的,而不关键字初始化数组的“新”象在下面的示例:数组初始化的“新”

int[] x = { 10, 20, 30 }; 

这是否意味着在阵列将在被初始化堆栈,因为关键字“新”是必要的初始化堆上的东西?

+1

句法糖不同于新的语言结构。它与其他阵列相同。 – 2014-10-08 08:23:18

+0

您可能正在寻找stackalloc关键字http://msdn.microsoft.com/en-us/library/cx9s2sy4.aspx – 2014-10-08 08:25:03

+0

如果您使用的是托管代码,那么不需要。为了分配内存,每个对象都需要'new'关键字。非托管代码是一个完全不同的野兽,并且可能存在如上所述的方式。我记得在某处读到有一种方法可以“推迟”构造函数,但仍然需要在对象处于可用状态之前的某个时刻调用它。 – 2014-10-08 08:31:04

回答

4

简短的回答:第

告诉你的代码是简写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]; 
-2

中间代码是相同的新的和没有新的初始化。

示例代码:

public class Class1 
{ 
    int[] a = new int[4]; 
} 

public class Class2 
{ 
    int[] a = { 1, 2, 3, 4 }; 
} 

编译:

(因为我没有必要点上传图片,你可以在ILDASM查看)

0

我想补充的东西这里更多。

堆栈中的内容是int数组的堆地址。让 说,当你将该数组传递给某个函数时,那么 传递的是Stack的heapAddress值。