c# - 多播委托(delegate)总是做最后一个操作

标签 c# delegates

所以我有以下代码:

namespace ConsoleApplication1
{
    public delegate int Transformer(int x);

    class Test
    {
        public static void Transform(int[] values, Transformer t)
        {
            for (int i = 0; i < values.Length; i++)
            {
                values[i] = t(values[i]);
            }
        }

       static int Square(int x)
        {
            return x * x;
        }

        static int Minus(int x)
       {
           return x - 1;
       }

        static void Main()
        {
            int[] values = { 1, 2, 3 };
            Transformer t = Test.Minus;
            t += Test.Square;

            Test.Transform(values, t);

            foreach (int i in values)
            {
                Console.Write(i + " ");
            }
        }
    }
}

为什么它总是只对数组(在我的例子中是 Square)做最后的操作。我需要更改什么才能同时执行 Minus 和 Square ?

最佳答案

多播委托(delegate)总是返回链中最后一个委托(delegate)的值。由于您不修改 Test.Minus 和 Test.Square 中的值,而是返回新值,因此仅应用后者。解决此问题的最简单方法是让您的转换器通过引用获取值并修改它们。例如:


namespace ConsoleApplication1
{
    public delegate void Transformer(ref int x);

    class Test
    {
        public static void Transform(int[] values, Transformer t)
        {
            for (int i = 0; i < values.Length; i++)
            {
                t(ref values[i]);
            }
        }

       static void Square(ref int x)
       {
           x = x * x;
       }

       static void Minus(ref int x)
       {
           x = x - 1;
       }

        static void Main()
        {
            int[] values = { 1, 2, 3 };
            Transformer t = Test.Minus;
            t += Test.Square;

            Test.Transform(values, t);

            foreach (int i in values)
            {
                Console.Write(i + " ");
            }
        }
    }
}

关于c# - 多播委托(delegate)总是做最后一个操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6925748/

相关文章:

c# - 用于进程间通信的 wcf 实现

java - 如何在 java 中实现委托(delegate)模式(如在 objective-c 中)

.net - 柯里化(Currying)委托(delegate)参数的最佳模式是什么(使用 .NET 2.0 或更高版本)?

C# 如何将函数调用保存在内存中供以后调用

ios - 如何区分委托(delegate)方法中的 UITextFields?

c# - Caliburn.Micro - 是否可以将事件绑定(bind)到 System.Action 或任何其他委托(delegate)?

c# - 如何使我的 Linq to Sql 实体实现 INotifyPropertyChanged

c# - 将数据绑定(bind)到 jquery 对话框

c# - 带有参数和 STDOUT 重定向的 Windows 任务计划程序作业

c# - 使用 ASP.NET 从服务器调整大小和显示图像