gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:37:47 25 4
gpt4 key购买 nike

假设我有一个名为 T 的类型。现在假设我制作了一个 T 类型的数组,它给我 T[]。在代码中,它给出:

var myArray = new T[10];

长度为 10。因此,我们可以看到这构成了一个包含 10 个 T 类型项的数组。这适用于 TintstringBinaryWriter 或任何标准。但是假设 T 是一个数组 类型,例如int[]string[]

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

var myArray = new int[][10];

通过将上一个示例中的 T 替换为 int[]。但这会产生语法错误,因为 C# 中的正确语法是:

var myArray = new int[10][];

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

这同样适用于任何维度的交错数组:

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

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

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

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

最佳答案

这样,初始化语法就反射(reflect)了访问语法。

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]中的索引。

现在,i的范围可以从0NUM_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# - 为什么 C# 中的锯齿状数组以相反的方式定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44893040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com