You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何C#允许创建编译时未知大小的数组?

编译时未指定大小却能创建C#数组的原因

你提到的C#文档里“声明数组需指定大小”,准确来说是数组在实例化时必须确定大小,但这个大小完全可以是运行时才能确定的值,而非必须是编译期常量,这就是你示例代码可行的核心原因。

具体拆解一下:

  • 数组的内存分配逻辑:C#数组是引用类型,内存分配在托管堆上。执行new int[size]时,CLR只需要在运行时拿到size的实际值(只要是非负整数),就能直接在堆上划出对应长度的内存空间,和size是不是编译时固定的数值无关。
  • 编译期的检查范围:C#编译器在编译阶段,只会验证new int[size]中的size是合法的整数类型(比如这里的int),以及代码语法合规,不需要知道size的具体数值。只有到运行时,函数被调用传入具体的size参数后,才会完成数组的实际创建。
  • 文档表述的误区:你看到的“声明数组需指定大小”,本质是指数组不能像List<T>那样无初始大小就创建(数组的大小一旦确定就无法修改),但并没有限制大小的取值必须是编译期常量。

你的示例代码完全符合这个逻辑:

public int[] CreateArray(int size) 
{
    int[] numbers = new int[size];

    for (int i=0; i<size; i++)
    {
        numbers[i] = i;
    }

    return numbers;
}

当然,这种写法只适合你提前知道最终数组大小的场景,如果是元素数量动态增长的情况,List<T>确实是更优选择——因为数组创建后大小固定,扩容需要手动复制元素到新数组,而List<T>已经封装了自动扩容的逻辑。

内容的提问来源于stack exchange,提问作者monsieurbits

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 13:12:08