如何访问以前添加到委托的函数
How to access previous functions added to a delegate
我是委托新手,据我所知,您可以向委托添加两个或更多函数(使用 +=
)。但是当你激活一个委托时,它总是会调用最后添加的函数。如果我想调用之前添加的函数怎么办?假设我有:
public static int add(int o1, int o2)
{
return o1 + o2;
}
public static int multiply(int o1, int o2)
{
return o1 * o2;
}
public static int minus(int o1, int o2)
{
return o1 - o2;
}
所以我使用委托(实际上是 Func
)来添加所有这些功能。
Func<int, int, int> f;
f = add;
f += multiply;
f += minus;
现在假设我想调用 multiply
或 add
,我不能这样做,如果我使用:
Console.WriteLine(f(1,2));
只会调用minus
。
编辑
顺便说一句,我知道可以使用-=
删除函数,但是如果函数数量很多,就不方便了。我正在寻找的解决方案是索引(比如在数组中)但是
f[2](5,3)
好像不行。
这在language specification(强调我的)中明确规定:
Invocation of a delegate instance whose invocation list contains
multiple entries proceeds by invoking each of the methods in the
invocation list, synchronously, in order. [...] If the delegate
invocation includes output parameters or a return value, their final
value will come from the invocation of the last delegate in the
list.
所以不是其他代表没有被执行。他们是。只是只有最后一个委托的 return 值被 returned。如果其他代表有一些副作用,比如打印到控制台,你就会看到它们。
编辑
如果您想像这样访问代表:
f[2](5,3)
那么您可能需要 List<Func<int, int, int>>
而不是多播委托。
我是委托新手,据我所知,您可以向委托添加两个或更多函数(使用 +=
)。但是当你激活一个委托时,它总是会调用最后添加的函数。如果我想调用之前添加的函数怎么办?假设我有:
public static int add(int o1, int o2)
{
return o1 + o2;
}
public static int multiply(int o1, int o2)
{
return o1 * o2;
}
public static int minus(int o1, int o2)
{
return o1 - o2;
}
所以我使用委托(实际上是 Func
)来添加所有这些功能。
Func<int, int, int> f;
f = add;
f += multiply;
f += minus;
现在假设我想调用 multiply
或 add
,我不能这样做,如果我使用:
Console.WriteLine(f(1,2));
只会调用minus
。
编辑
顺便说一句,我知道可以使用-=
删除函数,但是如果函数数量很多,就不方便了。我正在寻找的解决方案是索引(比如在数组中)但是
f[2](5,3)
好像不行。
这在language specification(强调我的)中明确规定:
Invocation of a delegate instance whose invocation list contains multiple entries proceeds by invoking each of the methods in the invocation list, synchronously, in order. [...] If the delegate invocation includes output parameters or a return value, their final value will come from the invocation of the last delegate in the list.
所以不是其他代表没有被执行。他们是。只是只有最后一个委托的 return 值被 returned。如果其他代表有一些副作用,比如打印到控制台,你就会看到它们。
编辑
如果您想像这样访问代表:
f[2](5,3)
那么您可能需要 List<Func<int, int, int>>
而不是多播委托。