为什么委托工作作为参考?

时间:2018-04-23 14:54:54

标签: c# delegates ref

我有节目

    public delegate T Transformer<T>(T arg);
    public class Util
    {
        public static void Transform<T>(T[] values, Transformer<T> t)
        {
            for (int i = 0; i < values.Length; i++)
                values[i] = t(values[i]);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            int[] values = { 1, 2, 3 };
            Util.Transform(values, Square); // Hook in Square
            foreach (int i in values)
            Console.Write(i + " "); // 1 4 9
            Console.ReadLine();
        }
        static int Square(int x) => x * x;
    }

为什么Util.Transform(values,Square)会更改值[]数组?它已经像引用变量一样工作。我只是想看看输出结果没有改变名为“values []”的源数组。

1 个答案:

答案 0 :(得分:1)

您可以更改方法:

public class Util
{
    public static T[] Transform<T>(T[] values, Transformer<T> t)
    {
        return values.Select(x => t(x)).ToArray();
    }
}

然后您可以将其称为

var result = Utils.Transform(values, Square);

如果您无法更改该方法,则需要在调用之前复制数组:

var result = values.ToArray();
Utils.Transform(result, Square);