具有引用类型的 C# 数组扩展方法 - 如何更改引用

C# Array Extention Methods with Reference Type - how to change reference

我在 Unity 工作,我有不同类型的数组需要检查和操作。在引用类型出现一些问题后,我找到了以下解决方案:

我创建了这样的 class "ArrayHelper"

public class ArrayHelper {
    public static void TrimArray<T>(ref T[] array)
    {
        T[] newArray = new T[array.Length - 1];
        for (int i = 0; i < newArray.Length; i++)
        {
            newArray[i] = array[i];
        }
        array = newArray;
    }
}

我是这样使用这个方法的:

void Start()
{
    ArrayHelper.TrimArray(ref myArray);
}

虽然这可行,但我认为它不是很优雅。我发现 this thread 他们展示了我如何做到这一点:

void Start()
{
    nextPaths.Trim();
}

为此,我将 ArrayHelper class 更改为:

public static class ArrayExtensionMethods {
    public static void Trim<T>(this T[] array)
    {
        T[] newArray = new T[array.Length - 1];
        for (int i = 0; i < newArray.Length; i++)
        {
            newArray[i] = array[i];
        }
        array = newArray;
    }
}

当我调用该方法时,它不会更改数组。我怀疑这是由于引用。有没有一种方法可以像这样正确地操作我的数组?

注意: 'ArrayExtensionMethods' 中还有其他方法可以以更复杂的方式操作数组。因此,我正在寻找一个通用的解决方案来解决我的问题,而不是只能用来替换 "Trim()" 方法的解决方案。

基本上没有。不能在扩展方法的第一个参数上使用 ref 除非它是值类型。您必须改为 return 数组。或者...使用 List<T> 而不是裸 T[].

Ref 扩展方法仅在结构上运行,文档非常丰富且不清楚何时引入(介于 C# 7.0 和 7.2 之间)。

参见示例 C# 7.2 ref/in extension methods

An array is not a struct, it's a reference type

所以不,你不能这样做。

我可以提供参考:

        public static void Trim<T>(this T[] array, ref T[] output)
        {
            T[] newArray = new T[array.Length - 1];
            for (int i = 0; i < newArray.Length; i++)
            {
                newArray[i] = array[i];
            }
            output = newArray;
        }

使用:

a.Trim(ref a);