数组初始化疑问:为何重新赋值未触发索引越界错误?
问题解答
你的认知没错:数组确实是固定长度的,一旦创建就无法修改其长度,越界访问数组索引会触发"Index was outside the bounds of the array"错误。但你写的代码根本没在修改原数组,而是在给变量重新赋值新数组,这就是代码能正常运行的原因。
拆解代码逻辑
看你的这段代码:
private static int[] return_Array() { int[] arr = new int[5]; arr = [1,2,3,4,5,6]; return arr; }
- 第一行
int[] arr = new int[5];:创建了一个长度为5的int数组对象,并让变量arr指向这个对象。 - 第二行
arr = [1,2,3,4,5,6];:这是C# 9及以上版本的数组字面量语法,等价于new int[] {1,2,3,4,5,6}——它会创建一个全新的长度为6的数组对象,然后把变量arr的指向从原来的长度5的数组,改成指向这个新的长度6的数组。原来的长度5的数组因为没有变量引用它,后续会被.NET的垃圾回收机制清理。
同理,arr = new int[] {1,2,3,4,5,6,7};也是一样的逻辑:创建一个长度为7的新数组,让arr指向它,和原来的数组毫无关系。
什么时候才会触发索引越界错误
只有当你试图访问原数组中不存在的索引时才会报错,比如把代码改成这样:
private static int[] return_Array() { int[] arr = new int[5]; // 原数组索引范围是0-4,访问索引5属于越界 arr[5] = 6; return arr; }
这时候运行代码才会触发"Index was outside the bounds of the array"错误。
核心区别
- 数组对象:一旦创建,长度固定不可变。
- 数组变量:只是一个引用,它可以指向任何同类型的数组对象,不管那个对象的长度是多少。你代码里的操作都是修改变量的指向,不是修改原数组本身。
内容的提问来源于stack exchange,提问作者Mohammed Imadh
相关产品推荐
相关产品推荐

