Unity中C# For循环填充数组元素异常问题求助
问题原因及解决方案
核心问题出在引用类型的复用上——如果你在for循环外只创建了一个引用类型的实例,循环里只是修改这个实例的内容,再把它赋值给数组的每个索引,那数组里所有元素都会指向同一个内存地址,最终显示的自然是最后一次修改的内容。
举个你大概率写错的代码示例:
// 错误写法:复用同一个引用类型实例 public class QuoteItem { public string text; } QuoteItem[] quotes = new QuoteItem[3]; QuoteItem tempItem = new QuoteItem(); // 仅创建一次实例 for (int i = 0; i < quotes.Length; i++) { // 只是修改已有实例的内容,而非创建新实例 tempItem.text = $"名言内容{i}"; quotes[i] = tempItem; // 所有数组元素都指向同一个tempItem }
解决方法很简单:把实例创建的逻辑放到循环内部,每次循环都生成新的实例,再赋值给数组:
// 正确写法:循环内创建新实例 QuoteItem[] quotes = new QuoteItem[3]; for (int i = 0; i < quotes.Length; i++) { QuoteItem tempItem = new QuoteItem(); // 每次循环新建实例 tempItem.text = $"名言内容{i}"; quotes[i] = tempItem; }
如果你的quotes是string数组(string是特殊的引用类型,具有不可变性),那循环赋值本身不会出现这个问题,这时候要检查:
- 循环内是不是每次都给数组赋值了同一个字符串变量
- 是不是读取名言的逻辑有问题,比如每次都取到同一个内容
你可以在循环内加一句Debug.Log(quotes[i].text);,确认赋值阶段每个元素的内容是否正确,快速定位问题环节。
内容的提问来源于stack exchange,提问作者Nihlson
相关产品推荐
相关产品推荐

