多播时结果没有得到

时间:2015-11-20 20:03:42

标签: c# delegates

我正在使用委托类型从单个点调用多个函数。但是当我这样做时,我的结果有点不对。

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。怎么样?

4 个答案:

答案 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));
}