使用具有返回值的多个函数调用委托

我试图理解代表的概念,并得到一个查询。 假设我们将一个委托定义为返回类型为int,并接受int类型的2个参数。

代表声明:

public delegate int BinaryOp(int x, int y); 

现在,假设我们有2个方法(加法和乘法)都接受2个int参数并返回int结果。

码:

  static int Add(int x, int y) { return x + y; } static int Multiply(int x, int y) { return x * y; } 

现在,当add和multiply方法被添加到此委托中时,然后当委托被调用时,如:

 BinaryOp b = new BinaryOp(Add); b+=new BinaryOp(Multiply); int value=delegate_name(2,3); 

然后,根据我的理解,这两种方法都被调用。 现在,两个方法中的哪一个存储在值变量中? 或者它在这种情况下返回一个数组?

实际上,通过一些技巧和强制转换,您可以得到所有结果:

 var b = new BinaryOp(Add); b += new BinaryOp(Multiply); var results = b.GetInvocationList().Select(x => (int)x.DynamicInvoke(2, 3)); foreach (var result in results) Console.WriteLine(result); 

带输出:

 5 6 

您将获得添加到多播委托的最后一个方法的返回值。 在这种情况下,您将获得Multiply的返回值。

有关详细信息,请参阅文档: https : //msdn.microsoft.com/en-us/library/ms173172.aspx

是的,调用多播委托会调用所有已订阅的方法,但不会返回结果数组 – 仅返回最后一个订阅者返回的结果。

要获得所有订阅者的返回结果,您可以做的是构建一个类型化的Func集合,然后您可以调用并整理结果:

  IEnumerable InvokeResults(IEnumerable> operations, int x, int y) { return operations.Select(op => op(x, y)); } 

并调用如下:

  var results = InvokeResults(new Func[] {Add, Multiply}, 2, 3);