所有可能的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