Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我需要“我需要”;新";对于锯齿阵列初始化?_C#_Arrays_Jagged Arrays - Fatal编程技术网

C# 为什么我需要“我需要”;新";对于锯齿阵列初始化?

C# 为什么我需要“我需要”;新";对于锯齿阵列初始化?,c#,arrays,jagged-arrays,C#,Arrays,Jagged Arrays,过去,我使用完整的初始化语法初始化了数组: int[] arr = new int[1] { 1 }; 但一旦我发现我不需要在初始化过程中指定类型,我就停止这样做: int[] arr = { 1 }; 我最近再次研究了锯齿状数组,发现这种语法有一个非常奇怪的问题: int[][] jag = { { 1, 2 }, { 3 } }; 上面的代码无效,这让我很困惑。此外,这种语法很好: int[][] jag = { new []{ 1, 2 }, new []{ 3 } }; 显然,这

过去,我使用完整的初始化语法初始化了数组:

int[] arr = new int[1] { 1 };
但一旦我发现我不需要在初始化过程中指定类型,我就停止这样做:

int[] arr = { 1 };
我最近再次研究了锯齿状数组,发现这种语法有一个非常奇怪的问题:

int[][] jag = { { 1, 2 }, { 3 } };
上面的代码无效,这让我很困惑。此外,这种语法很好:

int[][] jag = { new []{ 1, 2 }, new []{ 3 } };
显然,这里唯一的区别是“new”关键字。通常,在其他语言中,“new”关键字表示变量将是引用类型,但在C#中,数组始终是引用类型,因此确实不需要为数组指定“new”。有人知道我为什么需要在这个锯齿状数组初始化中指定它吗?这是一个bug,或者只是一个未实现的编译器特性

这是虫子吗

没有

有人知道我为什么需要在这个锯齿状数组初始化中指定它吗

C#语言必须只允许矩形多维数组使用数组初始值设定项语法,而不允许交错多维数组使用数组初始值设定项语法,这在理论上没有根本原因

您想要的功能不存在,因为从来没有人设计、指定、实现、测试、记录和发布过该功能。这是因为该功能可以合理地被描述为非常非常不重要,与您可以花费时间的几乎任何其他可能的功能相比。功能是昂贵的;设计团队试图将时间花在解决实际用户问题的功能上

像你建议的那样的小“糖”特性得到了实现;例如,表达式体方法。但几乎每个程序都包含小方法。绝大多数程序甚至不包含一个锯齿状的、一次初始化的数组,所以这个特性可以节省几乎不需要半打击键的工作。不值得

也许只是一个未实现的编译器特性,它将在C#的未来版本中修复

如果这个特性对您很重要,那么设计和实现过程是开放的。您可以自由地提出、设计、指定、实现、测试和记录该特性,并查看他们是否接受您的请求

这是虫子吗

没有

有人知道我为什么需要在这个锯齿状数组初始化中指定它吗

C#语言必须只允许矩形多维数组使用数组初始值设定项语法,而不允许交错多维数组使用数组初始值设定项语法,这在理论上没有根本原因

您想要的功能不存在,因为从来没有人设计、指定、实现、测试、记录和发布过该功能。这是因为该功能可以合理地被描述为非常非常不重要,与您可以花费时间的几乎任何其他可能的功能相比。功能是昂贵的;设计团队试图将时间花在解决实际用户问题的功能上

像你建议的那样的小“糖”特性得到了实现;例如,表达式体方法。但几乎每个程序都包含小方法。绝大多数程序甚至不包含一个锯齿状的、一次初始化的数组,所以这个特性可以节省几乎不需要半打击键的工作。不值得

也许只是一个未实现的编译器特性,它将在C#的未来版本中修复


如果这个特性对您很重要,那么设计和实现过程是开放的。您可以自由地提出、设计、指定、实现、测试和记录该功能,并查看它们是否接受您的请求。

但在C中,数组始终是引用类型,因此确实不需要为不遵循的数组指定“新建”。这不是一个bug,只是他们在语言中加入了一点编译糖分。将来可能会添加,也可能不会添加。您可以尝试在GitHub请求它,但由于锯齿数组(以我的经验)很少出现在fricken中,我怀疑有多少操作……”“new”并不意味着类型是引用类型。因为这是错误的,所以基于这个错误前提的任何结论都不符合逻辑<代码>整数x=新整数()是一种完全合法的方式,尽管很奇怪,但它可以编写
intx=0
new
表示正在分配新的存储。对于值类型,该存储从临时池中分配,然后复制,对于引用类型,该存储从长期池中分配。另一个原因是嵌套的大括号语法
{…},{…},{…},}
是调用
的语法糖。对于
IList
类型,添加
System.Array
没有
Add
——对于“本机”多维数组:请注意,如果C#编译器和jitter能够证明复制elide是安全的,则允许它们复制elide。例如,如果您有
S S=news(123)
对于值类型
S
,规范的要求是分配新存储,将新存储传递给构造函数,构造函数运行,然后按值将值类型复制到
S
。练习:在什么情况下,编译器可以合法地将
s
的存储传递给构造函数,并跳过alloc和copy?“在什么情况下不能?”威尔:这不是故意的。我只是在陈述事实。所有文本通信中都存在一种偏见,使得事实陈述听起来像是批评,但它们只是事实。但在C#中,数组总是引用类型,因此没有必要为不遵循的数组指定“new”。这不是一个bug,只是他们在语言中加入了一点编译糖分。将来可能会添加,也可能不会添加。您可以尝试在GitHub请求它,但由于锯齿阵列(以我的经验)很少出现,我怀疑有多少动作……“新”并不意味着类型