C#中使用函数向数组添加元素后数组未更新的问题求助
问题原因分析
你的问题出在数组的引用传递和方法调用的处理上:
- C#中数组是引用类型,但默认参数传递是按值传递引用——也就是方法里的
myArr是外部mangaArray引用的副本。 - 你在
AddToArray里用Array.Resize(ref myArr, ...),这里的ref只作用于方法内部的myArr变量,会让它指向新创建的扩容后的数组,但外部的mangaArray还是原来的引用,没被更新。 - 虽然方法返回了新数组,但你在调用时没有接收这个返回值,所以外部数组自然不会变化。
解决方案
有两种简单的修复方式:
方式一:接收方法返回的新数组
修改Main方法的调用代码,把返回的新数组赋值给原来的变量:
static void Main(string[] args) { string[] mangaArray = {"Ai Yori Aoshi", "Monster Musume", "Interviews with Monster Girls"}; // 接收返回的新数组,覆盖原变量 mangaArray = (string[])AddToArray(mangaArray, "Corpse Party"); PrintArray(mangaArray); }
注意这里需要把返回的Array类型强制转换为string[],因为你的方法返回的是Array基类。
方式二:给方法参数添加ref修饰符
让方法直接修改外部的数组引用,不需要返回值:
// 修改方法参数为ref string[],返回值改为void static void AddToArray(ref string[] myArr, string added) { Array.Resize(ref myArr, myArr.Length + 1); myArr[myArr.Length - 1] = added; } // 调用时也要加ref关键字 static void Main(string[] args) { string[] mangaArray = {"Ai Yori Aoshi", "Monster Musume", "Interviews with Monster Girls"}; AddToArray(ref mangaArray, "Corpse Party"); PrintArray(mangaArray); }
这种方式下,Array.Resize的ref和方法参数的ref配合,直接修改了外部变量的引用,不需要接收返回值。
额外建议
如果是练习阶段之后的实际开发,更推荐使用List<string>来代替数组,因为它本身就支持动态添加元素,不需要手动处理扩容:
static void Main(string[] args) { List<string> mangaList = new List<string>{"Ai Yori Aoshi", "Monster Musume", "Interviews with Monster Girls"}; mangaList.Add("Corpse Party"); // 遍历打印List for (int i = 0; i < mangaList.Count; i++) { Console.WriteLine($"[{i}] {mangaList[i]}"); } }
内容的提问来源于stack exchange,提问作者Mediocrates78
相关产品推荐
相关产品推荐

