All possible array initialization syntaxes
使用C可以使用哪些数组初始化语法?
这些是简单数组的当前声明和初始化方法。
1 2 3 4 | string[] array = new string[2]; // creates array of length 2, default values string[] array = new string[] {"A","B" }; // creates populated array of length 2 string[] array = {"A" ,"B" }; // creates populated array of length 2 string[] array = new[] {"A","B" }; // created populated array of length 2 |
请注意,还存在其他获取数组的技术,如
还请注意,在上述声明中,前两个可以将左侧的
1 2 3 4 |
C中的数组创建语法是:
在第一个中,大小可以是任何非负整数值,数组元素初始化为默认值。
在第二个实例中,大小必须是一个常量,并且给定的元素数必须匹配。必须存在从给定元素到给定数组元素类型的隐式转换。
在第三个元素中,元素必须隐式转换为元素类型,大小由给定的元素数决定。
在第四个元素中,通过计算具有类型的所有给定元素的最佳类型(如果有)来推断数组元素的类型。所有元素都必须隐式转换为该类型。大小由给定的元素数决定。这种语法是在C 3.0中引入的。
还有一种语法只能在声明中使用:
1 | int[] x = { 10, 20, 30 }; |
元素必须隐式转换为元素类型。大小由给定的元素数决定。
there isn't an all-in-one guide
请参阅第7.6.10.4节"数组创建表达式"中的C 4.0规范。
非空数组
var data0 = new int[3] var data1 = new int[3] { 1, 2, 3 } var data2 = new int[] { 1, 2, 3 } var data3 = new[] { 1, 2, 3 } var data4 = { 1, 2, 3 } 不可编译。用int[] data5 = { 1, 2, 3 } 代替。
空数组
var data6 = new int[0] var data7 = new int[] { } var data8 = new [] { } 和int[] data9 = new [] { } 不可编译。var data10 = { } 不可编译。用int[] data11 = { } 代替。
作为方法的参数
只有可以用
Foo(new int[2]) Foo(new int[2] { 1, 2 }) Foo(new int[] { 1, 2 }) Foo(new[] { 1, 2 }) Foo({ 1, 2 }) 不可编译Foo(new int[0]) Foo(new int[] { }) Foo({}) 不可编译
1 | Enumerable.Repeat(String.Empty, count).ToArray() |
将创建空字符串数组,重复"count"次。如果您想用相同但特殊的默认元素值初始化数组。小心引用类型,所有元素都将引用相同的对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
如果要初始化预先初始化的equal(non-
1 | var array = Enumerable.Repeat(string.Empty, 37).ToArray(); |
另外,请参加本次讨论。
创建自定义类数组的示例
下面是类定义。
1 2 3 4 5 | public class DummyUser { public string email { get; set; } public string language { get; set; } } |
这是初始化数组的方法:
1 2 3 4 5 6 7 8 9 10 11 | private DummyUser[] arrDummyUser = new DummyUser[] { new DummyUser{ email ="[email protected]", language ="English" }, new DummyUser{ email ="[email protected]", language ="Spanish" } }; |
不带LINQ重复:
1 |
1 2 3 4 |
或
1 |
或
1 | string[] array = {"Sunday" ,"Monday" }; |
在多维阵列中
1 2 3 4 5 6 7 8 | Dim i, j As Integer Dim strArr(1, 2) As String strArr(0, 0) ="First (0,0)" strArr(0, 1) ="Second (0,1)" strArr(1, 0) ="Third (1,0)" strArr(1, 1) ="Fourth (1,1)" |
1 2 3 4 |
创建和初始化对象数组的另一种方法。这类似于@amol上面发布的示例,只是这个示例使用了构造函数。一点点的多态性,我无法抗拒。
1 2 3 4 5 | IUser[] userArray = new IUser[] { new DummyUser("[email protected]","Gibberish"), new SmartyUser("[email protected]","Italian","Engineer") }; |
上下文类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | interface IUser { string EMail { get; } // immutable, so get only an no set string Language { get; } } public class DummyUser : IUser { public DummyUser(string email, string language) { m_email = email; m_language = language; } private string m_email; public string EMail { get { return m_email; } } private string m_language; public string Language { get { return m_language; } } } public class SmartyUser : IUser { public SmartyUser(string email, string language, string occupation) { m_email = email; m_language = language; m_occupation = occupation; } private string m_email; public string EMail { get { return m_email; } } private string m_language; public string Language { get { return m_language; } } private string m_occupation; } |
表达式的平凡解。注意,使用newarrayin可以只创建一维数组。
1 2 |
您还可以创建动态数组,也就是说,在创建数组之前,您可以先向用户询问数组的大小。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | Console.Write("Enter size of array"); int n = Convert.ToInt16(Console.ReadLine()); int[] dynamicSizedArray= new int[n]; // Here we have created an array of size n Console.WriteLine("Input Elements"); for(int i=0;i<n;i++) { dynamicSizedArray[i] = Convert.ToInt32(Console.ReadLine()); } Console.WriteLine("Elements of array are :"); foreach (int i in dynamicSizedArray) { Console.WriteLine(i); } Console.ReadKey(); |