Why "foo = new double[int x, int y]" is legal but

本文关键字:int quot but legal is foo new double Why | 更新日期: 2023-09-27 18:12:03

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

为什么有可能初始化一个多数组的维度与变量,而不是一个锯齿数组的?

Why "foo = new double[int x, int y]" is legal but

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

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

对于锯齿数组,您必须分别初始化每个"leg" -没有语法可以一次初始化每个leg的大小:

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

为什么没有语法?因为规范没有要求,而且在"典型的"锯齿数组中,腿有不同的长度,否则2d数组可能更合适。

锯齿数组中的每个嵌套数组可以有不同的长度。如果必须使用语法示例初始化它,则要求它们都具有相同的长度。这根本说不通。你必须使用像这样的东西:

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