关于C#:所有可能的数组初始化语法

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

请注意,还存在其他获取数组的技术,如IEnumerable上的linq ToArray()扩展。

还请注意,在上述声明中,前两个可以将左侧的string[]替换为var(c 3+),因为右侧的信息足以推断正确的类型。第三行必须按照显示的方式编写,因为数组初始化语法本身不足以满足编译器的要求。第四种方法也可以使用推理。因此,如果你对简洁这件事很感兴趣,上面的内容可以写成

1
2
3
4
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
var array = new[] {"A","B" }; // created populated array of length 2


C中的数组创建语法是:

1
2
3
4
new int[3]
new int[3] { 10, 20, 30 }
new int[] { 10, 20, 30 }
new[] { 10, 20, 30 }

在第一个中,大小可以是任何非负整数值,数组元素初始化为默认值。

在第二个实例中,大小必须是一个常量,并且给定的元素数必须匹配。必须存在从给定元素到给定数组元素类型的隐式转换。

在第三个元素中,元素必须隐式转换为元素类型,大小由给定的元素数决定。

在第四个元素中,通过计算具有类型的所有给定元素的最佳类型(如果有)来推断数组元素的类型。所有元素都必须隐式转换为该类型。大小由给定的元素数决定。这种语法是在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 = { }代替。

作为方法的参数

只有可以用var关键字赋值的表达式才能作为参数传递。

  • 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
var contacts = new[]
{
    new
    {
        Name =" Eugene Zabokritski",
        PhoneNumbers = new[] {"206-555-0108","425-555-0001" }
    },
    new
    {
        Name =" Hanying Feng",
        PhoneNumbers = new[] {"650-555-0199" }
    }
};


如果要初始化预先初始化的equal(non-null或其他default元素的固定数组,请使用以下命令:

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
float[] floats = System.Array.ConvertAll(new float[16], v => 1.0f);

1
2
3
4
int[] array = new int[4];
array[0] = 10;
array[1] = 20;
array[2] = 30;

1
string[] week = new string[] {"Sunday","Monday","Tuesday"};

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
For Class initialization:
var page1 = new Class1();
var page2 = new Class2();
var pages = new UIViewController[] { page1, page2 };

创建和初始化对象数组的另一种方法。这类似于@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
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

您还可以创建动态数组,也就是说,在创建数组之前,您可以先向用户询问数组的大小。

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();