C#中数组的语法糖

Syntactic Sugar of Arrays in C#

当有人写:

string[] ArrayofStrings = new string[3]

幕后究竟发生了什么?就像 foreach 是移动 ienumerator 的语法糖,这相似吗?

我可能会误解你的意思,请随时要求澄清。

A​​ string 本身就是 characters 的数组,所以基本上你有一个 array 个数组

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

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

string[] ArrayofStrings = new string[3]

就意味着:

I would like a variable, called ArrayofStrings - and I would like for it to have three elements, all of which are null strings.

它并不是真正的语法糖,就像 ?.是,例如。

对于一些初始化数组的其他方法,请阅读。

是的,有一些语法糖:

string[] ArrayofStrings = new string[3]

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

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

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

正如您可以在 LINQPad or ildasm, these two statements don't emit the same IL 中轻松看到的那样。第一种方式调用

newarr      System.String

其中第二个通过

call        System.Array.CreateInstance
castclass   System.String[]

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

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