我有一个可序列化的类,我想在其他脚本中创建它的数组
[Serializable]
public class Question
{
public string fact;
}
现在我有另一个类来创建和初始化问题数组。
public class Initialize : MonoBehaviour
{
Question[] questions;
void Start()
{
questions = new Question[1];
questions[0].fact = "First Question"; // Here I am getting NullReferenceException
}
}
另一个值得一提的有趣事情是,当我使用 IEnumerator 初始化相同的数组并在开始时产生返回 null 时,代码按预期工作,这是代码
public class Initialize : MonoBehaviour
{
Question[] questions;
void Start()
{
questions = new Question[1];
StartCoroutine(InitializeArray());
}
IEnumerator InitializeArray()
{
yield return null;
questions[0].fact = "First Question";
}
}
当我在初始化之前使用 yield 语句时,它可以正常工作,当我再次注释掉 yield 语句时,NullReferenceException 罢工,这怎么可能?
声明引用类型数组时,每个元素都初始化为 null。这就是为什么当您尝试访问其中一个数组元素的属性时会得到 NullReferenceException。
若要避免这种情况,可以使用初始化的引用类型初始化数组:
Question[] questions;
questions = new Question[]
{
new Question
{
fact = "First Question"
},
new Question
{
fact = "Second Question"
}
};
当你打电话时
questions = new Question[1];
您正在实例化一个大小为 1 的空 Question
数组,因此第一个元素将包含 null。要使代码正常工作,您需要使用Question
实例填充它,如下所示:
questions = new[] { new Question() };
你的第二个代码片段将出于同样的原因失败;你正在创建一个数组,其中没有Question
对象。yield return null
提前退出 InitializeArray
方法,这会阻止运行失败的代码。
初始化您自己的自定义类数组的最佳方法:
public class Initialize : MonoBehaviour
{
Question[] questions;
void Start()
{
questions = new Question[2];
questions[0] = new Question();
questions[0].fact = "First Question";
questions[1] = new Question();
questions[1].fact = "Second Question";
}
}
如果有多个元素要初始化,我们可以使用循环,就像:
questions = new Question[100];
for (int i = 0; i < questions.Length; i++)
{
questions[i] = new Question();
questions[i].fact = "Question Number " + i;
}