【问题标题】:Omitting c# new from jagged array initialization从锯齿状数组初始化中省略 c# new
【发布时间】:2013-01-07 16:10:31
【问题描述】:

发件人:http://msdn.microsoft.com/en-us/library/2s05feca.aspx

请注意,您不能在元素初始化中省略 new 运算符,因为元素没有默认初始化:

int[][] jaggedArray3 = 
{
    new int[] {1,3,5,7,9},
    new int[] {0,2,4,6},
    new int[] {11,22}
};

什么意思?

为什么可以省略 new in:

int[]    arrSimp = { 1, 2, 3 };
int[,]   arrMult = { { 1, 1 }, { 2, 2 }, { 3, 3 } };

但不可能在:

int[][,] arrJagg = {new int[,] { { 1, 1} }, new int[,] { { 2, 2 } }, new int[,] { { 3, 3 } } };

【问题讨论】:

  • 可能有技术原因,例如语法歧义,或某些极端情况导致词法分析过于复杂。在这种情况下,C# 设计者倾向于在简单性(或现状)方面犯错,尤其是当使用概率很低并且存在相当等价的语法不会破坏程序员的使用时。
  • 也许只是允许它允许一些噩梦般的解析案例......
  • @ChrisSinclair 没关系,但我不明白他们给出的解释(没有默认初始化)。 int foo[] 是否默认初始化不使用new?

标签: c# new-operator jagged-arrays


【解决方案1】:

本质上,答案是“因为他们(即语言设计者)选择不这样做。引用 Eric Lippert 的话:

每个未实现的功能都没有实现的原因相同: 默认情况下未实现功能。为了成为实施 必须(1)考虑,(2)设计,(3)指定,(4) 实施、(5) 测试、(6) 记录和 (7) 发货。

从技术上讲,这是有充分理由的,那就是与一维和多维数组相比,锯齿状数组的定义。

一维或多维数组可以用简单的英语表示为 T 的 X 维数组,其中锯齿状数组必须表示为 T 的数组的数组。在第二种情况下,两者之间存在松散耦合内部数组和外部数组。也就是说,您可以将一个新数组分配给外部数组中的某个位置,而 x 维数组是固定的。

既然我们知道Jagged数组在实现上与多维数组有很大的不同,我们也可以假设为什么对2的集成支持程度不同。添加支持肯定不是不可能的,只是一个问题需求和时间。

(作为预告,为什么只添加对锯齿状数组的支持?您自己的自定义类型怎么样?)

【讨论】:

  • 对我来说,它似乎有点缺少语法糖。在普通的 C 中,锯齿状数组可以很容易地通过一个包含指针的数组来实现。
【解决方案2】:

首先,多么巧合,你的问题的一个方面是我今天博客的主题:

http://ericlippert.com/2013/01/24/five-dollar-words-for-programmers-elision/

您在 C# 对表达式的分类方式中发现了一个小“缺陷”。事实证明,数组初始值设定项语法{1, 2, 3} 不是表达式。相反,它是一个只能用作另一个表达式的一部分的句法单元:

new[] { 1, 2, 3 }
new int[] { 1, 2, 3 }
new int[3] { 1, 2, 3 }
new int[,] { { 1, 2, 3 } }
... and so on

或作为集合初始化器的一部分:

new List<int> { 1, 2, 3 }

或在变量声明中:

int[] x = { 1, 2, 3 };

在需要表达式的任何其他上下文中使用数组初始值设定项语法是合法的。例如:

int[] x;
x = { 1, 2, 3 }; 

不合法。

这只是 C# 语言的一个奇怪的极端情况。您发现的不一致没有更深层次的含义。

【讨论】:

  • 就这样发生了。 :) 我只是想深入研究 C# 的极端情况(如果我这样做或那样会发生什么以及为什么它不起作用),MSDN 不是很精确什么是 {1,2,3} 甚至它是语法糖我希望它也可以在锯齿状数组上工作。看来我错了。
猜你喜欢
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
  • 2019-06-17
  • 2011-08-21
  • 2014-05-03
相关资源
最近更新 更多