C#数组能否隐式改变大小?遭遇意外行为求助
问题解答
你遇到的情况核心原因是:数组本身的大小不可变,但数组变量可以重新指向新的数组,具体拆解如下:
初始代码
uint[] numberList = new uint[8];- 这行创建了一个长度为8的
uint数组对象,同时让变量numberList引用(指向)这个数组,此时numberList.Length返回8。
- 这行创建了一个长度为8的
后续赋值
numberList = [1,1,1,2,3,8,8,7,10,10,11];- 这里的
[...]是C# 12新增的数组字面量语法,它会直接创建一个包含11个元素的全新uint数组对象。 - 执行这行代码时,变量
numberList的引用被更新——从原来的长度8数组,改为指向这个新的长度11数组。 - 原来的长度8数组因为不再被任何变量引用,后续会被.NET垃圾回收器自动清理。
- 这里的
关于数组不可变性的正确理解
- 你说的“C#数组大小通常不可变”是对的:一旦某个数组对象被创建,它的长度就固定了,无法直接修改(比如不能给已有数组添加/删除元素来改变长度)。但数组变量只是一个“指向数组的指针”,它可以随时切换指向其他数组对象,这和数组本身的不可变性并不冲突。
可以用一个简单类比理解:你一开始拿了个能装8杯水的杯子(旧数组),后来放下这个杯子,换了个能装11杯水的新杯子(新数组)——杯子本身的容量没变,但你手里的杯子换成了新的。
另外补充两个代码细节:
- 你写了
using static System.Random;但没用到Random的静态成员,注释里的new Random()如果要生成随机数,建议只创建一个Random实例,避免短时间内多次实例化导致生成重复随机数。 - 数组字面量
[...]仅在C# 12及以上版本可用,这也是你在.NET 8.0(对应C# 12)环境下能正常运行的前提。
内容的提问来源于stack exchange,提问作者giurno B
相关产品推荐
相关产品推荐

