【问题标题】:Why "foo = new double[int x, int y]" is legal but not "foo = new double[int x][int y]"?为什么“do = new double[int x, int y]”是合法的,而不是“for = new double[int x][int y]”?
【发布时间】:2014-07-08 16:02:14
【问题描述】:

我知道锯齿状数组和多维数组之间存在差异。我知道使用“List”而不是数组的数组通常更受欢迎。

谁能解释一下,为什么在下面的代码中,第一个是允许的,而第二个是错误的?我只是想更好地理解 C#...

法律:

public class Banana
{
    double[,] _banana;
    public Banana(int h, int w)
    {
        _banana= new double[h,w];
    }               
}

非法(错误:需要一个常量值而不是 h 和 w):

public class Banana
{
    double[][] _banana;
    public Banana(int h, int w)
    {
        _banana= new double[h][w]{};
    }               
}  

TL;DR;

为什么可以用变量初始化多数组的维度,而不是锯齿数组?

【问题讨论】:

  • 如果你立即初始化两个维度的长度,这不是一个锯齿状数组。
  • C# 的设计者并不认为允许这种初始化程序是一个足够有用的功能,可以将其包含在语言中。如果您希望数组的所有元素具有相同的宽度,请使用二维数组;如果您希望它们可能不同,则需要自己分配它们。
  • 因为规则是这样说的。你可以在 java 中做到这一点(它缺少第一种语法)——这不是某种固有的不可能。

标签: c# arrays multidimensional-array jagged-arrays


【解决方案1】:

int[4,5] 是包含 20 个整数的单个对象。 int[4][] 是一个包含四个整数数组引用的对象。拥有int[][] foo = new int[4][5]; 相当于:

int[][] foo = new int[4][];
for (int temp = 0; temp < 4; temp++)
  foo[i] = new int[5];

StringBuilder bar[] = new StringBuilder[4](); 等同于:

StringBuilder bar = new StringBuilder[4];
for (int temp = 0; temp < 4; temp++)
  bar[i] = new StringBuilder();

这样的特性在很多情况下可能会有所帮助,并且在概念上不会有什么特别的问题,但是显式初始化数组元素所需的代码并不是特别繁重,而显式编写这样的代码有助于明确这一点引用数组和这些引用所指的事物都是独立的实体。

【讨论】:

    【解决方案2】:

    对于锯齿状数组,您必须分别初始化每条“腿” - 没有语法可以一次性初始化每条腿的大小:

    public Banana(int h, int w)
    {
        _banana = new double[h][];
        for (int i = 0; i < h; i++)
        {
            _banana[i] = new double[w];
        }
    } 
    

    为什么没有语法?因为规范不需要它,并且在“典型”锯齿状阵列中,腿有不同的长度,否则二维阵列可能更合适。

    【讨论】:

    • 谢谢!还没有足够的代表来投票,但这对我的理解很有用!
    【解决方案3】:

    交错数组中的每个嵌套数组都可以有不同的长度。如果您必须使用语法示例对其进行初始化,则它们都需要具有相同的长度。这根本没有意义。你必须使用类似的东西:

    _banana = new double[h][];
    for(var i = 0; i < h; i++)
    {
        _banana[h] = new double[w];
    }
    

    【讨论】:

    • 谢谢!这对我的理解也很有用,但我还没有足够的代表来投票!
    猜你喜欢
    • 2019-12-02
    • 2011-09-07
    • 2012-12-14
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    • 2016-06-28
    相关资源
    最近更新 更多