多播时未获得结果

本文关键字:结果 多播 | 更新日期: 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));
}