如何创建委托数组并使用该数组?

Aku*_*Aku 0 c# delegates

我必须编写 Eve 类来编写以下代码:

class MainClass
  {    int sum = 5;
    public  void add (int x)
    {
      sum += x;
    }
    public static void write (int x)
    {
      Console.WriteLine("x = " + x);
    }
    public static void Main (string[] args)
    {
      Eve p = new Eve();
      MainClass m = new MainClass(); 
      p.registrate(m.add);
      p.registrate(write);
      p.registrate (delegate (int x) { 
                      System.Console.WriteLine(" I have {0} ", x);
                    }); 
      p.registrate (x => System.Console.WriteLine (" Square : {0} ", x * x));
      p.run(10);
      p.run(5);
                  Console.WriteLine(" Sum is {0} ", m.sum);
    }
  }
Run Code Online (Sandbox Code Playgroud)

输出:

x = 10

我有 10 个

平方:100

x = 5

我有 5 个

平方:25

总和是 20

所以我认为我必须使用代表。方法 registarte 应该将委托添加到委托数组中。

我写了这样的代码,但我不确定是正确的。

 public class Eve
    {
        int i;
        public Eve()
        {
            i = 0;
        }
        public delegate void ComputeDelegate(int x);

        ComputeDelegate[] delegates = new ComputeDelegate[2];

        public void registrate(ComputeDelegate a)
        {
            if (i == 2) i = 0;
            delegates[i] += a;
            i++;
        }

        public void run()
        {
            //delegates[0].;
        }
}
        public class MainClass
        {
            int sum = 5;
            public void add(int x)
            {
                sum += x;
            }
            public void write(int x)
            {
                Console.WriteLine("x = " + x);
            }
            static void Main()
            {
                Eve proc1 = new Eve();
                MainClass m = new MainClass();

                proc1.registrate(m.add);
                proc1.registrate(m.write);


            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我有问题如何编写方法运行?或者这相同,但以另一种方式,我如何才能在委托数组中使用午餐方法?

Guf*_*ffa 5

当您想要添加委托时,列表比数组更好。您可以使用通用委托类型来代替创建自定义委托类型:

List<Action<int>> delegates = new List<Action<int>>();
Run Code Online (Sandbox Code Playgroud)

要注册委托,只需将其添加到列表中即可:

public void registrate(Action<int> a) {
  delegates.Add(a);
}
Run Code Online (Sandbox Code Playgroud)

要使用委托,只需在它们后面加上括号来调用它们即可。与常规方法的语法相同。例子:

int input = 5;
foreach (Action<int> a in delegates) {
  a(input);
}
Run Code Online (Sandbox Code Playgroud)