具有引用类型的 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);
我在 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);