C#原地修改数组:为何直接赋值新数组无效,逐个改元素有效?
为什么直接赋值数组参数不生效,而逐个修改元素可以?
这本质是C#中引用类型的参数传递规则导致的,核心点在于:数组是引用类型,但方法参数默认是传值传递——这里传递的是「原数组引用的副本」,而非引用本身。
逐个修改元素生效的原因
当你通过input[i] = newList.ElementAt(i)修改元素时,方法内部的input变量(原数组引用的副本)依然指向外部传入的原始数组对象。你修改的是这个对象内部的元素值,外部调用者持有的原数组引用指向的是同一个对象,自然能看到修改后的结果。
直接赋值数组不生效的原因
当你执行input = newList.ToArray()时,你只是把方法内部的input局部变量(引用的副本)指向了一个新创建的数组对象,但外部调用者手里的原数组引用完全没变化——它依然指向最初的那个数组。所以这个赋值操作只在方法内部有效,外部根本感知不到。
补充:如果想让赋值新数组生效怎么办?
如果一定要通过替换数组对象来实现,需要把方法参数声明为ref类型:
public static void RightCircularRotation(ref int[] input){ var newList = new List<int>(); newList.Add(input[input.Length-1]); for(var i = 0; i < input.Length-1; i++){ newList.Add(input[i]); } input = newList.ToArray(); }
调用时也要加上ref关键字:
int[] arr = {1,2,3}; RightCircularRotation(ref arr);
但这其实已经不是「原地修改原数组」了,而是直接替换了外部变量指向的数组对象,和你最初想要的「原地修改」逻辑是不同的。
内容的提问来源于stack exchange,提问作者Michael G
相关产品推荐
相关产品推荐

