C#中this修饰数组参数如何修改原对象?模拟JS array.push遇阻
问题解析与解决方案
关于this参数的传递问题
C#中,扩展方法的this参数是按值传递的——哪怕数组是引用类型,这里传递的也是引用的副本。你提到的“按变量传递”其实是引用类型的传递特性,但对于扩展方法来说,你无法直接修改原变量的引用指向,因为this参数不允许用ref修饰。
要让方法内的修改影响原对象,核心要明确:C#的数组是固定长度的,Array.Resize本质是创建一个新数组并复制原元素,而非修改原数组的长度。你在扩展方法里修改的只是方法内部的引用副本,外部变量依然指向原数组,自然看不到变化。
复刻JS的array.push的可行方案
由于不能使用List<T>,我们可以通过两种方式实现类似效果:
方案1:返回新数组,由调用者重新赋值
这种方式符合C#引用类型的使用习惯,逻辑清晰:
public static T[] Push<T>(this T[] array, params T[] items) { int newLength = array.Length + items.Length; Array.Resize(ref array, newLength); Array.Copy(items, 0, array, array.Length - items.Length, items.Length); return array; }
调用示例:
int[] myArray = {1,2,3}; myArray = myArray.Push(4,5); // 此时myArray指向新数组,长度为5
方案2:使用带ref参数的普通静态方法
这种方式可以直接修改原变量的引用,更贴近JS的push修改原数组的行为,同时返回新长度:
public static int Push<T>(ref T[] array, params T[] items) { int newLength = array.Length + items.Length; Array.Resize(ref array, newLength); Array.Copy(items, 0, array, array.Length - items.Length, items.Length); return newLength; }
调用示例:
int[] myArray = {1,2,3}; int newLength = Push(ref myArray, 4,5); // 原myArray已指向新数组,newLength返回5
原代码不生效的原因
你的代码中Array.Resize(ref array, ...)修改的是方法内部的array变量(原引用的副本),外部的数组变量依然指向原来的固定长度数组。扩展方法无法通过this参数修改外部变量的引用,所以修改无法对外生效。
内容的提问来源于stack exchange,提问作者Szecska
相关产品推荐
相关产品推荐

