C#中数组的句法糖

时间:2017-07-16 13:58:24

标签: c# arrays types syntactic-sugar

当有人写道:

string[] ArrayofStrings = new string[3]

幕后真的发生了什么?就像foreach是用于移动ienunerator的语法糖一样,这是相似的吗?

3 个答案:

答案 0 :(得分:1)

我可能会误解你,所以请随时要求澄清。

字符串字符本身的数组,所以基本上你有一个数组数组

现在,数组本身就是集合,您可以在其中提供对第一个元素(标记为0)的引用,以及在第一个元素之后还有多少元素。在你的情况下,你有3(从0到2)。您可以通过告诉第一个元素的差异来索引它们,因为这些元素在内存中彼此相邻。

所以你有一个字符数组,意思是string,它是ArrayOfStrings的一个元素,它本身也是一个数组。

答案 1 :(得分:1)

string[] ArrayofStrings = new string[3]

只是意味着:

  

我想要一个名为ArrayofStrings的变量 - 我想要   它有三个元素,所有元素都是空字符串。

这不是真正的语法糖吗?例如。

对于其他一些初始化数组的方法,请给https://stackoverflow.com/a/5678244/34092一个读数。

答案 2 :(得分:1)

是的,有一些语法糖:

string[] ArrayofStrings = new string[3]

首先,基类库类型string有C#别名System.String。 [我讨厌它。]

其次,数组构造函数看起来不像其他构造函数。没有特殊的语法,你必须写:

string[] ArrayofStrings2 = (string[])Array.CreateInstance(typeof(string), 3);

正如您可以在LINQPadildasm中轻松看到的那样,这两个陈述不会发出相同的IL。第一种方式叫

newarr      System.String

第二个通过

执行此操作
call        System.Array.CreateInstance
castclass   System.String[]

(我认为如果C#语言没有那个语法 - 糖,C#编译器会做一些编译器魔法并发出第一个IL而不是第二个。)

但是,正如@mjwills指出的那样,其他初始化表达式可能更完整,因为您想要一个空数组是值得怀疑的。