所有可能的数组初始化语法

Jos*_*ard 667 c# arrays syntax array-initialization

C#可以使用的所有数组初始化语法是什么?

Ant*_*ram 716

这些是简单数组的当前声明和初始化方法.

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
Run Code Online (Sandbox Code Playgroud)

请注意,存在其他获取数组的技术,例如Linq ToArray()扩展IEnumerable<T>.

另请注意,在上面的声明中,前两个可以替换string[]左边的var(C#3+),因为右边的信息足以推断出正确的类型.必须按显示的方式编写第三行,因为单独的数组初始化语法不足以满足编译器的要求.第四个也可以使用推理.因此,如果你是整个简洁的事情,上面的内容可以写成

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 
Run Code Online (Sandbox Code Playgroud)

  • 出于好奇,有人可以解释为什么第三行中的初始化表达式不能单独使用(例如传递到方法中)或分配给“var”变量吗? (4认同)

Eri*_*ert 430

C#中表达式的数组创建语法是:

new int[3]
new int[3] { 10, 20, 30 }
new int[] { 10, 20, 30 }
new[] { 10, 20, 30 }
Run Code Online (Sandbox Code Playgroud)

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

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

在第三个元素中,元素必须可以隐式转换为元素类型,并且大小由给定元素的数量确定.

在第四个中,通过计算具有类型的所有给定元素的最佳类型(如果存在)来推断数组元素的类型.所有元素必须可以隐式转换为该类型.大小由给定的元素数量确定.此语法是在C#3.0中引入的.

还有一种语法只能在声明中使用:

int[] x = { 10, 20, 30 };
Run Code Online (Sandbox Code Playgroud)

元素必须可隐式转换为元素类型.大小由给定的元素数量确定.

没有一体化指南

我将向您介绍C#4.0规范,第7.6.10.4节"阵列创建表达式".

  • @Jeffrey:如果我们走这条路,那就开始变得愚蠢了.例如,`"1,2,3,4".split(',')`. (17认同)
  • 不完全是C#"语法",但我们不要忘记(我个人最喜欢的)`Array.CreateInstance(typeof(int),3)`! (11认同)
  • 然后对于多维数组,存在"嵌套"符号,如`new int [,] {{3,7},{103,107},{10003,10007},};`,等等`int [ ,,]`,`int [,,,]`,... (11认同)
  • @BoltClock:你提到的第一个语法是"隐式类型化数组创建表达式".第二个是"匿名对象创建表达式".您没有列出其他两个类似的语法; 它们是"对象初始化器"和"集合初始化器". (8认同)
  • @ Learning-Overthinker-Confused:你有两匹马.你想知道哪个更快.你是(1)比赛马,或者(2)问互联网上一个从未见过马的陌生人他认为哪一匹更快?**比赛你的马**.你想知道哪一个更"高效"?首先要制定一个可衡量的效率标准; 请记住,效率是*每单位成本*产生的价值,因此请仔细定义您的价值和成本.然后双向编写代码并测量其效率.**用科学来回答科学问题,**不要随意陌生人猜测. (6认同)
  • @ Learning-Overthinker-Confused:记住"更快"是无关紧要的.您的客户并不关心"更快".您的客户关心*足够快*.如果数组和列表非常相似,以至于客户无法区分,则无关紧要.如果数组和列表对于客户的要求来说太慢,那么哪个更快并不重要.**始终考虑与客户方案相关的绩效**.您可以浪费大量时间来优化代码,从而不会给客户带来任何善意. (4认同)
  • @ Learning-Overthinker-Confused:但是,如果你对两件事中哪一件更快有疑问,请写一个测试,看看是否有*可观察的*差异.无法观察到的差异是无关紧要的差异. (3认同)

kis*_*pit 106

非空数组

  • 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({}) 是不可编辑的

  • 将无效语法与有效语法分开是更好的. (14认同)

Ato*_*osk 49

Enumerable.Repeat(String.Empty, count).ToArray()
Run Code Online (Sandbox Code Playgroud)

将创建重复'count'次的空字符串数组.如果您想使用相同但特殊的默认元素值初始化数组.注意引用类型,所有元素都将引用相同的对象.

  • 是的,在`var arr1 = Enumerable.Repeat(new object(),10).ToArray();`你得到10个对同一个对象的引用.要创建10个不同的对象,可以使用`var arr2 = Enumerable.Repeat(/*dummy:*/false,10).Select(x => new object()).ToArray();`或类似的. (5认同)

小智 18

var contacts = new[]
{
    new 
    {
        Name = " Eugene Zabokritski",
        PhoneNumbers = new[] { "206-555-0108", "425-555-0001" }
    },
    new 
    {
        Name = " Hanying Feng",
        PhoneNumbers = new[] { "650-555-0199" }
    }
};
Run Code Online (Sandbox Code Playgroud)


Shi*_*mmy 16

如果要初始化预先初始化的相等(非元素null或非default元素)元素的固定数组,请使用:

var array = Enumerable.Repeat(string.Empty, 37).ToArray();
Run Code Online (Sandbox Code Playgroud)

另请参加本次讨论.


Amo*_*mol 12

创建自定义类的数组的示例

下面是类定义.

public class DummyUser
{
    public string email { get; set; }
    public string language { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是您初始化数组的方法:

private DummyUser[] arrDummyUser = new DummyUser[]
{
    new DummyUser{
       email = "abc.xyz@email.com",
       language = "English"
    },
    new DummyUser{
       email = "def@email.com",
       language = "Spanish"
    }
};
Run Code Online (Sandbox Code Playgroud)


You*_*oub 11

只是一个注释

以下数组:

string[] array = new string[2];
string[] array2 = new string[] { "A", "B" };
string[] array3 = { "A" , "B" };
string[] array4 = new[] { "A", "B" };
Run Code Online (Sandbox Code Playgroud)

将被编译为:

string[] array = new string[2];
string[] array2 = new string[] { "A", "B" };
string[] array3 = new string[] { "A", "B" };
string[] array4 = new string[] { "A", "B" };
Run Code Online (Sandbox Code Playgroud)


小智 7

没有LINQ重复:

float[] floats = System.Array.ConvertAll(new float[16], v => 1.0f);
Run Code Online (Sandbox Code Playgroud)


小智 6

int[] array = new int[4]; 
array[0] = 10;
array[1] = 20;
array[2] = 30;
Run Code Online (Sandbox Code Playgroud)

要么

string[] week = new string[] {"Sunday","Monday","Tuesday"};
Run Code Online (Sandbox Code Playgroud)

要么

string[] array = { "Sunday" , "Monday" };
Run Code Online (Sandbox Code Playgroud)

并在多维数组中

    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)"
Run Code Online (Sandbox Code Playgroud)

  • 嗨,最后一个示例块似乎是Visual Basic,问题是c#示例. (4认同)