编程语言
首页 > 编程语言> > 为什么C#中的锯齿状数组以相反的方式定义?

为什么C#中的锯齿状数组以相反的方式定义?

作者:互联网

假设我有一个名为T的类型.现在让我说我创建了一个T类型的数组,它给了我T [].在代码中,它给出:

var myArray = new T[10];

长度为10.因此,我们可以看到这使得一个包含10个T类型项的数组.如果T是int,string,BinaryWriter或任何标准项,则它可以工作.但是,假设T是一个数组类型,如int []或string [].

然后,如果我们想要定义一个包含10个T(int [])类型项的数组,它应该给出这样的结果:

var myArray = new int[][10];

通过在前面的例子中用int []替换T.但这会产生语法错误,因为C#中的正确语法是:

var myArray = new int[10][];

如果我们遵循第一个例子的逻辑,那么应该给出一个包含未定义数量的包含10个整数的数组的数组.

这同样适用于锯齿状数组的任何维度:

var myArray = new int[][][10];

是错的,因为语法正确的方法是:

var myArray = new int[10][][];

这不是个人偏好或代码风格的争论,而只是逻辑:当我们定义数组类型的数组时,为什么语法不同于我们定义其他任何数组的数组?

解决方法:

这样,初始化语法镜像了访问语法.

var myArray = new int[NUM_ROWS][];
...
/* Initialize rows of myArray */
...
var x = myArray[0][5]; /* Should this be row 0, col 5; or row 5, col 0? */

将myArray [0] [5]解析为(myArray [5])[0]将是违反直觉的,因为索引将从左向右反转,因此我们将myArray [0] [5]解析为(myArray的[0])[5].

因此,在myArray [i] [j]中,i对应于二维数组的索引,j对应于一维数组myArray [i]的索引.

现在,我可以从0到NUM_ROWS-1,因此它与访问语法对称,以初始化var myArray = new int [NUM_ROWS] [].这样,左侧括号组仍然对应于二维阵列的长度,右侧括号组仍然对应于一维阵列.

编辑:我看到有人发表评论a link to an article where Eric Lippert goes through a more elaborate example and justification.

标签:c,language-design
来源: https://codeday.me/bug/20190611/1217247.html