2017-04-24 6 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)'は実際に引数の値を変更しないので、最後の関数の結果は3 + 2なので、Add2(3)となり、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で述べたようにして)

また、リンクされた答えは1として、あなたは方法一緒にチェーンに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)'への最初の呼び出しを忘れてしまい、最後に 'Add3(2)'ではなく 'Add2(3)'もあります。 – Rafalon

+0

出力を保存して次のコールで使用することはできますか? – Lyrk

関連する問題