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
相关产品推荐
相关产品推荐

