【问题标题】:C# Array Extention Methods with Reference Type - how to change reference具有引用类型的 C# 数组扩展方法 - 如何更改引用
【发布时间】:2019-11-14 12:21:45
【问题描述】:

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

我已经像这样创建了“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 类更改为:

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()”方法的解决方案。

【问题讨论】:

标签: c# arrays extension-methods


【解决方案1】:

我可以提供参考:

        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);

【讨论】:

    【解决方案2】:

    不,基本上。除非它是值类型,否则不能在扩展方法的第一个参数上使用 ref。您必须改为返回数组。或者...使用List&lt;T&gt; 而不是赤裸裸的T[]

    【讨论】:

      【解决方案3】:

      Ref 扩展方法,在它们被准确引入时(在 C# 7.0 和 7.2 之间的某个地方)被详细记录并且不清楚,只对结构进行操作。

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

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

      所以不,你不能这样做。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-15
        相关资源
        最近更新 更多