Unity中C#如何正确声明固定长度的List数组变量?
Unity固定长度List数组的简洁初始化方案
报错原因说明
你写的public List<GameObject>[] charactersOnBoardSortedP1 = new List<GameObject>[5];仅初始化了数组本身,List<GameObject>属于引用类型,数组创建后每个元素默认值为null,直接访问就会抛出Object reference not set to an instance of an object空引用错误。
简洁写法推荐
1. LINQ一行式写法(最简洁)
首先引入命名空间:
using System.Linq;
声明字段时直接写,长度可以自由修改,哪怕是100也只需要改数字参数:
public List<GameObject>[] charactersOnBoardSortedP1 = Enumerable.Range(0, 5) .Select(_ => new List<GameObject>()) .ToArray();
注意:不要误用
Enumerable.Repeat(new List<GameObject>(), 5).ToArray(),该写法会让所有数组元素指向同一个List实例,修改其中一个元素会同步影响其他所有元素。
2. 通用封装方法(无LINQ依赖、性能更优)
如果项目不想依赖LINQ,可以封装一个通用初始化方法,一次编写多处调用:
// 可以放到项目的通用工具类中 public static T[] InitRefTypeArray<T>(int length) where T : new() { T[] result = new T[length]; for (int i = 0; i < length; i++) { result[i] = new T(); } return result; }
调用时只需要指定类型和长度即可:
// 初始化长度为5的List数组 public List<GameObject>[] charactersOnBoardSortedP1 = InitRefTypeArray<List<GameObject>>(5); // 初始化长度为100的List数组也只需要改参数 public List<GameObject>[] testArray = InitRefTypeArray<List<GameObject>>(100);
Unity场景下的补充说明
如果是MonoBehaviour脚本中的字段,也可以选择在Awake/Start生命周期中执行初始化逻辑,写法和上面一致。
内容的提问来源于stack exchange,提问作者Jim Hopper
相关产品推荐
相关产品推荐

