2017-04-24 194 views
1

我想添加2個更多的功能給我的委託,但它似乎不處理我添加的功能。按照計劃產出5.我期待10.爲什麼會出現這種情況?爲什麼輸出是5?

using System; 

namespace abc 
{ 
public delegate int Del(int k); 

class Class1 
{ 
    public int Add2(int value) 
    { 
     return value = value + 2; 
    } 

    public int Add3(int value) 
    { 
     return value = value + 3; 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Class1 c = new Class1(); 
     Del mydel = c.Add2; 
     mydel += c.Add3; 
     mydel += c.Add2; 

     Console.WriteLine(mydel(3)); 
     Console.ReadLine(); 
    } 
} 
} 
+0

'mydel(3)'實際上並沒有改變參數的值,所以你得到最後一個函數的結果是'Add2(3)'這是3 + 2,所以5 – Rafalon

回答

5

當你調用mydel(3)情況是這樣的:

  1. Add2(3)被調用。這返回3 + 2 = 5,其返回值被丟棄。
  2. Add3(3)被調用。這返回3 + 3 = 6,返回值 被丟棄。
  3. Add2(3)被調用。這返回3 + 2 = 5,其返回值被打印。

當您鏈接委託時,其中一個的返回值不作爲參數傳遞給鏈接的參數。

請注意,代表是按LIFO順序調用的。

如果您想了解如何使用代表實際將功能鏈接在一起,see this thread

另外,按照鏈接的答案(以及由Toskr在下面的評論中提到的),你可以使用GetInvocationList()DynamicInvoke()到鏈中的方法一起使用,但是這是一件非常不尋常的事情:

static void Main() 
{ 
    Class1 c = new Class1(); 
    Del mydel = c.Add2; 
    mydel += c.Add3; 
    mydel += c.Add2; 

    int result = 3; 

    foreach (var func in mydel.GetInvocationList()) 
    { 
     result = (int)func.DynamicInvoke(result); 
    } 

    Console.WriteLine(result); 
} 
+0

擊敗了它,我是通過大致這一半:) – BugFinder

+1

也忘了第一次調用'Add2(3)',最後也是'Add2(3)'而不是'Add3(2)'。 – Rafalon

+0

是否可以保存輸出並在下次調用時使用它? – Lyrk