使用new关键字初始化c#数组与使用字面量初始化的区别

9

简单问题 到底什么是它们之间的区别

int[] intarray = new int[2]{1,2};

并且。
int[] intarray2 = {4,5,6};

“new” 究竟是做什么的呢?需要用它吗?

我猜它只是分配内存……或者其他什么操作?抱歉,我对 C# 完全不了解,学习过程中有些问题需要解决。

5个回答

12
第二个是 数组初始化器语法,它只是一种语法糖。两者都用各自的值初始化新的数组实例,第一个更为明确(在右侧重复指定了一个由两个元素组成的整型数组,这很显然,编译器可以推断出这些信息)。
因此,以下语句是等价的:
int[] array = new int[2] { 1, 2 };

并且:

int[] array = { 1, 2 };

并且:

var array = new[] { 1, 2 };

在所有情况下,我们都在初始化包含两个整数的数组。个人而言,我更喜欢最后一种语法。


什么是语法糖?我以前从未听说过这个术语。 - user475353
2
“语法糖”是指内置于编程语言中的简化语法的特性,但实际上并不存在于编译后的汇编代码中。当我们查看生成的IL时,会发现第一种更为明确的语法形式。但在编写代码时,最好让编译器来完成这项工作,而不是我们自己手动添加冗余的语法。为什么要使用第一种语法形式?为什么要在右侧重复int?为什么要重复数组的大小?当我们简单地写出“{1, 2}”时,所有这些都变得非常明显了。从这个简单的表达式中,我们就可以知道它包含两个元素,并且类型为int。 - Darin Dimitrov
好的解释。我认为最重要的一点是,语法糖使我们能够用简洁的方式表达一个想法,但仍然有一个有效的程序。 - ChaosPandion
当将表单{4,5,6}作为参数传递给函数或从函数返回时,会生成编译时错误。在这些情况下,需要使用new关键字和方括号。 - Dave F

2
数组是 引用类型,使用C#的new关键字分配,就像其他引用类型一样。
数组的一个语法是C#编译器也能认识的简短语法 -(也有其他变化)。您的两个示例都会为数组实例分配(new)并初始化{元素}: 第一个版本明确声明了数组的大小。
int[] intarray = new int[2]{1,2};

第二个版本允许C#编译器通过初始化列表中的元素数量推断数组的大小。
int[] intarray2 = {4,5,6};

通常情况下,C#编译器会识别专门的语法来声明和初始化C#本地数组,掩盖了使用底层的System.Array类的事实。

1
int[] intarray2 = {4,5,6};

与......完全相同:

int[] intarray2 = new int[] {4, 5, 6};

缩略写法只是编码的一种缩写形式,事实上编译器会为数组分配同样数量的内存空间。第一个示例中没有显式地写出“new”,就像将整数分配给双精度变量时可以写入强制转换符号也可以不写(因为这是安全的强制转换),效果相同。例如:

int i = 12;
double d = i;

与之相同:

int i = 12;
double d = (double)i;

0

这是一种语法糖。

它们之间没有区别;它们将编译为相同的IL。
但是,数组初始化器只能用于初始化数组字段或属性。


0

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