为什么" foo = new double [int x,int y]"是合法但不是" foo = new double [int x] [int y]"?

时间:2014-07-08 16:02:14

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

我知道锯齿状和多维数组之间存在差异。我知道通常可以使用“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;

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

3 个答案:

答案 0 :(得分:0)

使用锯齿状数组,你必须分别初始化每个“腿” - 没有语法在一次传递中初始化每条腿的大小:

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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();

这样的功能在许多情况下可能会有所帮助,并且在概念上不会有任何特别的错误,但显式初始化数组元素所需的代码并不特别繁琐,并且明确地编写这样的代码有助于明确引用数组和引用引用的内容都是单独的实体。