为何调用List.Clear()会清除类中引用的列表?Unity代码问题求助
问题解决:Unity中List引用导致数据被清空的问题
问题本质
你遇到的问题核心是List是引用类型:所有Question实例的choice字段都指向了同一个全局choices列表对象。不管调用Clear()还是往里面添加新元素,所有关联的Question实例都会同步看到这个列表的变化——这就是为什么不调用Clear()会出现重复数据,调用后之前存储的ques.choice也被清空的原因。
解决方案
有两种简单的修复方式,任选其一即可:
方式1:每次创建新的List(推荐)
去掉全局的choices列表,在AssignData方法内部每次创建新的List,确保每个Question的choice都是独立的对象:
修改后的GameController.cs:
List<Question> question_list = new List<Question>(); void Start() { AssignData("question_1", "aaa", "bbb", "ccc"); ViewData(); AssignData("question_2", "111", "222", "333"); ViewData(); } public void AssignData(string question, string choice1, string choice2, string choice3) { // 每次创建新的List存储选项 List<string> choices = new List<string>(); choices.Add(choice1); choices.Add(choice2); choices.Add(choice3); var ques = new Question(); ques.question = question; ques.choice = choices; ques.option = 2; question_list.Add(ques); } public void ViewData() { for(int i=0; i < question_list.Count; i++) { Debug.Log(question_list[i].question); foreach(var item in question_list[i].choice) { Debug.Log(item); } } }
方式2:为每个Question创建List副本
如果一定要保留全局的choices列表,在赋值给ques.choice时,创建一个列表的副本,这样修改原choices不会影响已存储的Question实例:
修改后的GameController.cs关键部分:
List<Question> question_list = new List<Question>(); List<string> choices = new List<string>(); void Start() { AssignData("question_1", "aaa", "bbb", "ccc"); ViewData(); choices.Clear(); AssignData("question_2", "111", "222", "333"); ViewData(); } public void AssignData(string question, string choice1, string choice2, string choice3) { choices.Add(choice1); choices.Add(choice2); choices.Add(choice3); var ques = new Question(); ques.question = question; // 创建副本,而非直接引用原列表 ques.choice = new List<string>(choices); ques.option = 2; question_list.Add(ques); }
效果验证
修改后运行代码,ViewData会输出你期望的结果:
question_1 aaa bbb ccc question_2 111 222 333
内容的提问来源于stack exchange,提问作者LearnProgramming
相关产品推荐
相关产品推荐

