没有使用关键字“new”进行数组初始化

4
在C#中,可以像以下示例一样在不使用关键字“new”的情况下初始化数组:
int[] x = { 10, 20, 30 };

这是否意味着,由于初始化需要使用关键字“new”,因此数组将在堆栈上初始化?

2
语法糖与新的语言结构不同。它和其他数组一样。 - Jeroen Vannevel
你可能正在寻找stackalloc关键字。http://msdn.microsoft.com/en-us/library/cx9s2sy4.aspx - Lorentz Vedeler
如果你正在使用托管代码,那么不行。每个对象都需要 new 关键字来分配内存。非托管代码是完全不同的东西,可能存在一种方法来实现,就像上面说的那样。我记得在某个地方读过有一种方法可以“延迟”构造函数,但仍然需要在对象处于可用状态之前某个时刻调用它。 - Kyle Baran
3个回答

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];

0

我想在这里补充一些内容。

在堆栈中,您将拥有int数组的heapAddress。假设当您将该数组传递到某个函数中时,您正在从堆栈传递heapAddress值。


-1

新初始化和未初始化的代码生成的中间代码是相同的。

示例代码:

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

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

已编译:

(由于我没有上传图片所需的必要点数,您可以在ildasm中查看它)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接