我创建一个数组,然后使用扩展方法将其追加到它:
private static void Main(string[] args)
{
int[] testInts = { 1, 2, 3, 4, 5 };
testInts.Append(6);
Console.WriteLine("Test Integers\n");
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)
有没有办法做到这一点。
这是因为数组是reference type,而NOT是value type。您需要用新的数组“替换”该数组以获得所需的结果。
这就像您想要的那样工作:
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 Integers\n");
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;
}
当您将testInts数组传递到扩展方法时,它实际上并没有传递引用,但是会创建一个新的本地值。因此,当您进行分配时,它确实的确会创建带有第6个值的本地数组。
您需要通过ref传递表,但是扩展方法无法做到这一点。
为了更好地理解这一点,将其用于参考类型时,请检查ref keyword guide。
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 Integers\n");
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);
int []是值类型。
如果调试应用程序,则在使用Append(..,..)方法时,您会发现在Concat()操作之后,“ arr”具有更新值(1..6),但是一旦控制进入在Append(..,..)方法之外,您的“ testInts”将具有旧值(1..5)。
尝试使用更新的代码。
public static int[] Append(this int[] arr, int value)
{
arr = arr.Concat(new[] { value }).ToArray();
return arr;
}
和main(..)
testInts = testInts.Append(6);
这样您将获得预期的结果。