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

C#数组初始化疑问:为何需实例化元素避免空引用?

为什么初始化引用类型数组后还需要单独实例化元素?

嘿,这个问题问得特别典型!很多刚接触C#引用类型的开发者都会踩这个坑,我来给你讲明白~

当你执行HighScore[] scoreobj = new HighScore[scoredata.Length];的时候,你只是创建了一个能容纳指定数量HighScore对象的"空架子"——数组里的每个位置默认都是null。因为HighScore是类(属于引用类型),引用类型数组的元素默认值就是空引用,相当于每个数组位置都只是个"占位符",并没有真正的对象存在。

打个比方:你买了一排空的储物格,每个格子都设计成能放一个盒子,但你得先给每个格子放上实实在在的盒子(也就是new HighScore()),才能往盒子里装东西(给Name和Score赋值)。要是直接往空格子里塞东西,自然就会触发空引用异常啦。

回到你的代码:
你注释掉的循环里直接给scoreobj[index].Name赋值,本质就是在操作一个null的对象,肯定会报错。而你手动执行scoreobj[1] = new HighScore();之后,这个数组位置才有了真正的HighScore实例,才能正常赋值和访问。

给你修正一下循环里的逻辑,这样就能正常运行了:

for (int index = 0; index < scoredata.Length; index++)
{
    // 先给当前数组位置创建HighScore实例
    scoreobj[index] = new HighScore();
    // 统一用分号拆分,避免之前代码里混用,和;的问题
    string[] dataParts = scoredata[index].Split(';');
    scoreobj[index].Name = dataParts[0];
    scoreobj[index].Score = Convert.ToInt32(dataParts[1]);
}

补充个小知识点:如果是值类型数组(比如int[]),初始化后每个元素会有默认值(比如0),所以不需要单独实例化;但引用类型数组就必须给每个元素手动创建实例,除非你刻意想让某些位置保持null。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:53:30