我无法理解第一种情况和第二种情况下数组初始化声明之间的区别
int[] array = new int[3] { 1, 2, 3 };
int[] secondArray = { 1, 2, 3 };
他们似乎做同样的事情,也许他们的工作方式不同?
显示的两条显示线的结果没有差异:
int[] array = new int[3] { 1, 2, 3 };
int[] secondArray = { 1, 2, 3 };
但是,
new int[n] {...}
语法和{...}
之间存在实际差异:
隐式类型不可用于替代数组初始值设定项:
var a1 = new int[3] { 1, 2, 3 }; // OK
var a2 = { 1, 2, 3 }; // Error: Cannot initialize an implicitly-typed variable with an array initializer
// BTW. You can omit the size
var a3 = new int[] { 1, 2, 3 }; // OK
使用替代语法,您无法指定大小,它总是被推断出来。
var a1 = new int[100]; // Array with 100 elements (all 0)
int[] a2 = { }; // Array with no elements
两行编译后的代码没有区别。
第二个只是一个捷径。两个语句具有相同的结果。较短的变体在 C# 的早期版本中不可用。
这两种数组初始化语法在编译器如何将其转换为 IL 方面没有区别(您可以在 sharplab.io 上使用它),并且与以下语法相同:
int[] thirdArray = new int[] { 1, 2, 3 };
唯一的区别是当您使用已经声明的变量时,即您可以使用第一个和第三个为现有数组变量分配新值,但不能使用第二个:
int[] arr;
arr = new int[3] { 1, 2, 3 }; // works
// arr = { 1, 2, 3 }; // won't compile
arr = new int[] { 1, 2, 3 }; // works
第一种情况明确使用 3 作为数组大小,第二种情况,大小是推断的。
如果您不想显式初始化值,这可能会起作用。