所有可能的C#数组初始化语法
C#中可能的所有可能的数组init语法是什么?
知道它是一个数组初始值设定项还是一个单独的声明,真是令人困惑。
注:我已经search了MSDN,使用Googlesearch,但没有一个一对一的指南。
我正在使用.NET 3.5和C#。
这些是简单数组的当前声明和初始化方法。
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
请注意,还有其他获取数组的技术,例如IEnumerable<T>
上的Linq ToArray()
扩展。
还要注意在上面的声明中,前两个可以用var
(C#3+)replace左边的string[]
,因为右边的信息足以推断出正确的types。 第三行必须写成显示,因为单独的数组初始化语法不足以满足编译器的要求。 所以,如果你把整个简短的事情,上面可以写成
var array = new string[2]; // creates array of length 2, default values var array = new string[] { "A", "B" }; // creates populated array of length 2 string[] array = { "A" , "B" }; // creates populated array of length 2
C#中expression式的数组创build语法是:
new int[3] new int[3] { 10, 20, 30 } new int[] { 10, 20, 30 } new[] { 10, 20, 30 }
在第一个中,大小可以是任何非负整数值,并且数组元素被初始化为默认值。
在第二个,大小必须是一个常数,并给出的元素数量必须匹配。 必须存在从给定元素到给定数组元素types的隐式转换。
在第三个元素中,元素必须隐式转换为元素types,大小由给定元素的数量决定。
在第四种情况下,数组元素的types是通过计算所有具有types的给定元素中的最佳types(如果有的话)来推断的。 所有元素都必须隐含地转换为该types。 大小由给定元素的数量决定。 这个语法是在C#3.0中引入的。
还有一种语法只能在声明中使用:
int[] x = { 10, 20, 30 };
元素必须隐式转换为元素types。 大小由给定元素的数量决定。
没有一个一个一个的指南
我参考C#4.0规范,第7.6.10.4节“数组创buildexpression式”。
非空数组
-
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 }
来代替。
空arrays
-
var data6 = new int[0]
-
var data7 = new int[] { }
-
var data8 = new [] { }
和int[] data9 = new [] { }
是不可编译的。 -
var data10 = { }
是不可编译的。 用int[] data11 = { }
代替。
作为一种方法的论据
只有可以使用var
关键字分配的expression式才能作为parameter passing。
-
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({})
不可编译
Enumerable.Repeat(String.Empty, count).ToArray()
将创build重复“数”次的空串的数组。 如果你想用同样的特殊的默认元素值初始化数组。 小心引用types,所有元素都会引用同一个对象。
var contacts = new[] { new { Name = " Eugene Zabokritski", PhoneNumbers = new[] { "206-555-0108", "425-555-0001" } }, new { Name = " Hanying Feng", PhoneNumbers = new[] { "650-555-0199" } } };
如果你想初始化一个预初始化相等(非null
或非default
)元素的固定数组,使用这个:
var array = Enumerable.Repeat(string.Empty, 37).ToArray();
也请参加这个讨论。
int[] array = new int[4]; array[0] = 10; array[1] = 20; array[2] = 30;
要么
string[] week = new string[] {"Sunday","Monday","Tuesday"};
要么
string[] array = { "Sunday" , "Monday" };
并在多维arrays
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)"
不用LINQ重复:
float[] floats = System.Array.ConvertAll(new float[16], v => 1.0f);
创build一个自定义类的数组的例子
以下是类定义。
public class DummyUser { public string email { get; set; } public string language { get; set; } }
这是你如何初始化数组:
private DummyUser[] arrDummyUser = new DummyUser[] { new DummyUser{ email = "abc.xyz@email.com", language = "English" }, new DummyUser{ email = "def@email.com", language = "Spanish" } };
你也可以创builddynamic数组,也就是说你可以在创build数组之前首先询问用户数组的大小。
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();
expression式的简单解决scheme。 请注意,使用NewArrayInit可以创build一维数组。
NewArrayExpression expr = Expression.NewArrayInit(typeof(int), new[] { Expression.Constant(2), Expression.Constant(3) }); int[] array = Expression.Lambda<Func<int[]>>(expr).Compile()(); // compile and call callback