多播时未获得结果
本文关键字:结果 多播 | 更新日期: 2023-09-27 18:23:37
我使用委托类型从一个点调用多个函数。但当我喜欢这样的时候,我得到的结果有点错误。
public delegate int MyDel(int a,int b);
public static int Add(int a, int b) { return a+b; }
public static int Sub(int a, int b) { return a-b; }
public static void Meth_del()
{
int x,y;
MyDel _delegate;
_delegate = Add;
_delegate += Sub;
Console.WriteLine( _delegate(5,4));
}
这里我应该得到结果9,然后是1,但只打印了1。怎样
这被称为闭包。之所以会发生这种情况,是因为在调用时,它将执行两个订阅的方法,并向您显示最终结果。
为了避免这种行为,您可以在第一次呼叫后取消订阅(_delegate = null
)、覆盖订阅者(=
)或订阅(+=
)。
public static void Meth_del()
{
int x,y;
MyDel _delegate;
_delegate = Add;
// Prints out 9.
Console.WriteLine( _delegate(5,4));
// Override subscribtion.
_delegate = Sub;
// Prints out 1.
Console.WriteLine( _delegate(5,4));
}
此外,您还可以使用+=
向代理添加订阅者(正如您在问题中所写的那样)。
即使调用了两个方法,也只有委托中的最后一个方法会返回结果。
此外,您只有一个Console.WriteLine()
调用,一个函数不能接收多个返回值。
为了达到你想要的效果,你可能必须这样排队。
public static Queue<int> Results = new Queue<int>();
public static void Add(int a, int b) { Results.Enqueue(a + b); }
public static void Sub(int a, int b) { Results.Enqueue(a - b); }
public delegate void MyDel(int a, int b);
public static void Meth_del()
{
int x, y;
MyDel _delegate;
_delegate = Add;
_delegate += Sub;
_delegate(5, 4);
while (Results.Any())
Console.WriteLine(Results.Dequeue());
}
您的代码确实执行了这两个方法,但它只显示最后添加的方法的返回值。如果你这样改变你的方法:
public static int Add(int a, int b) {
Console.WriteLine(a+b);
return a+b;
}
public static int Sub(int a, int b) {
Console.WriteLine(a-b);
return a-b;
}
您将看到9和1都是在控制台中编写的。
是的,很明显,委托中的最后一个方法将返回结果。
public static void Meth_del()
{
int x,y;
MyDel _delegate;
_delegate = Add;
Console.WriteLine( _delegate(5,4));
_delegate += Sub;
Console.WriteLine( _delegate(5,4));
}