Void数组扩展什么都不做

问题描述 投票:1回答:3

我创建一个数组,然后使用扩展方法将其追加到它:

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)有没有办法做到这一点。

c# arrays extension-methods
3个回答
0
投票

这是因为数组是reference type,而NOTvalue 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;
}

0
投票

为什么会这样

当您将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);

-2
投票

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

这样您将获得预期的结果。

© www.soinside.com 2019 - 2024. All rights reserved.