使用具有 return 值的多个函数调用委托
Calling delegate with multiple functions having return values
我正在尝试理解委托的概念并收到了一个查询。假设我们有一个定义为 return 类型为 int 的委托,并接受 2 个 int 类型的参数。
委托声明:
public delegate int BinaryOp(int x, int y);
现在,假设我们有 2 个方法(加法和乘法)都接受 2 个 int 参数和 returning 一个 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);
然后,按照我的理解,这两个方法都被调用了。现在,这两种方法中哪一种的结果存储在值变量中?还是在这种情况下 return 是一个数组?
您将获得添加到多播委托的最后一个方法的 return 值。在这种情况下,您将获得 Multiply
的 return 值。
有关更多信息,请参阅文档:https://msdn.microsoft.com/en-us/library/ms173172.aspx
是的,调用多播委托会调用所有订阅的方法,但不,不会返回结果数组 - 仅返回 result returned by the last subscriber。
要获得所有订阅者的返回结果,您可以改为构建一个类型化 Func
的集合,然后您可以调用并整理结果:
IEnumerable<int> InvokeResults(IEnumerable<Func<int, int, int>> operations,
int x, int y)
{
return operations.Select(op => op(x, y));
}
并像这样调用:
var results = InvokeResults(new Func<int, int, int>[] {Add, Multiply}, 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
我正在尝试理解委托的概念并收到了一个查询。假设我们有一个定义为 return 类型为 int 的委托,并接受 2 个 int 类型的参数。
委托声明:
public delegate int BinaryOp(int x, int y);
现在,假设我们有 2 个方法(加法和乘法)都接受 2 个 int 参数和 returning 一个 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);
然后,按照我的理解,这两个方法都被调用了。现在,这两种方法中哪一种的结果存储在值变量中?还是在这种情况下 return 是一个数组?
您将获得添加到多播委托的最后一个方法的 return 值。在这种情况下,您将获得 Multiply
的 return 值。
有关更多信息,请参阅文档:https://msdn.microsoft.com/en-us/library/ms173172.aspx
是的,调用多播委托会调用所有订阅的方法,但不,不会返回结果数组 - 仅返回 result returned by the last subscriber。
要获得所有订阅者的返回结果,您可以改为构建一个类型化 Func
的集合,然后您可以调用并整理结果:
IEnumerable<int> InvokeResults(IEnumerable<Func<int, int, int>> operations,
int x, int y)
{
return operations.Select(op => op(x, y));
}
并像这样调用:
var results = InvokeResults(new Func<int, int, int>[] {Add, Multiply}, 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