Void数组扩展方法不执行任何操作



我写了一个数组,然后用我的扩展方法附加到它上:

private static void Main(string[] args)
{
int[] testInts = { 1, 2, 3, 4, 5 };
testInts.Append(6);
Console.WriteLine("Test Integersn");
foreach (int variable in testInts)
{
Console.WriteLine(Convert.ToString(variable));
}            
Console.WriteLine("nPress any key to continue.");
Console.ReadKey();
}
public static void Append(this int[] arr, int value)
{
arr = arr.Concat(new[] { value }).ToArray();
}

但当它打印到控制台时,它仍然只有1、2、3、4、5?但当我只使用时

testInts = testInts.Concact(new[] { 6 }).ToArray()

它很好用吗?为什么会这样,有没有办法解决这个问题?

编辑

我使用空白的全部原因是我不想使用

testInt = testInt.Append(6)

它必须是testInt.Append(6)。有办法做到这一点吗?

为什么会发生这种情况

当您将testInts数组传递到扩展方法中时,它并没有真正传递变量,而是只传递引用。因此,当您进行赋值时,它确实会创建具有第6个值的局部数组,并将其赋值给一个局部变量(而不是原始调用方的(。

您需要通过ref传递变量,但这对于扩展方法是不可能的。

为了更好地理解这一点,请通过引用检查传递参数,无论是否使用ref关键字。

因为参数是对arr的引用,所以可以更改数组元素的值。然而,将参数重新分配到不同内存位置的尝试仅在方法内部起作用,不会影响原始变量arr.

使用扩展方法使其工作

using System;
using System.Linq;
public class Program
{
public static void Main(string[] args)
{
int[] testInts = { 1, 2, 3, 4, 5 };
testInts.Append(ref testInts,6);
Console.WriteLine("Test Integersn");
foreach (int variable in testInts)
{
Console.WriteLine(Convert.ToString(variable));
}            
Console.WriteLine("nPress any key to continue.");
}
}
public static class Extentions {
public static void Append(this int[] arr, ref int[] arr2, int value)
{
arr2 = arr.Concat(new[] { value }).ToArray();
}
}

另一种让它发挥作用的方法

如果你要做一个新的赋值,那么制定一个扩展方法是没有意义的。

public static int[] Append(int[] arr, int value)
{
return arr.Concat(new[] { value }).ToArray();
}
// use like this
arr = Append(arr, 6);

这是因为数组是引用类型,而NOT是值类型。
您需要用新数组"替换"该数组,以获得所需的结果

这就像你想要的那样工作:

testInts = testInts.Concat(new[] { 6 }).ToArray()

因为您在传递数组(引用类型对象(时再次设置了数组,所以您正在传递一个指向数组的指针(在应用程序内存中(,这就是您需要替换它的原因。如果您想更好地理解本主题,请阅读Pointers。

这里是您的代码的固定版本,请参阅扩展方法现在返回一个新的整数数组。

private static void Main(string[] args)
{
int[] testInts = { 1, 2, 3, 4, 5 };
testInts =  testInts.Append(6);
Console.WriteLine("Test Integersn");
foreach (int variable in testInts)
{
Console.WriteLine(Convert.ToString(variable));
}
Console.WriteLine("nPress any key to continue.");
Console.ReadKey();
}
public static int[] Append(this int[] arr, int value)
{
arr = arr.Concat(new[] { value }).ToArray();
return arr;
}

如果你调试你的应用程序,当你在Append(..,..(方法中时,你会发现"arr"在Concat((操作后有更新值(1..6(,但一旦控制权从Append(....(方法出来,你的"testInts"就会有旧值(1..5(。

尝试使用更新的代码。

public static int[] Append(this int[] arr, int value)
{
arr = arr.Concat(new[] { value }).ToArray();
return arr;
}

以及在主(..(中

testInts = testInts.Append(6);

这样你就会得到预期的结果。

最新更新