我正在使用委托类型从单个点调用多个函数。但是当我这样做时,我的结果有点不对。
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。怎么样?
答案 0 :(得分:0)
这叫做Closure。这是因为在调用时它将执行两个订阅的方法,并且将显示最终结果。
为避免此类行为,您可以在首次通话后取消订阅(_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));
}
此外,您可以使用+=
向代表添加订阅者(正如您在问题中所写的那样)。
答案 1 :(得分:0)
即使只调用了两个方法,委托中的最后一个方法也会返回结果。
此外,您只有一次调用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());
}
答案 2 :(得分:0)
您的代码确实执行了这两种方法,但它只显示上次添加的方法的返回值。如果您改变这样的方法:
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都写在控制台中。
答案 3 :(得分:-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));
}