11

私の質問は次のコードで詳しく説明されています-私がこれを尋ねている理由は、私がデリゲートを試しているからです:

//create the delegate          
delegate int del(int x);

class Program {


    static void Main(string[] args) {

        Program p;
        p = new Program();

        del d = p.a;
        d += p.b;
        d += p.c;
        d += p.d;
        d += p.e;
        Console.WriteLine(d(10)); //<<was hoping it would be 10+2+3+4+5+6

        Console.WriteLine("press [enter] to exit");
        Console.ReadLine();
    }

    private int a(int x) { Console.WriteLine("a is called"); return x + 2; }
    private int b(int x) { Console.WriteLine("b is called"); return x + 3; }
    private int c(int x) { Console.WriteLine("c is called"); return x + 4; }
    private int d(int x) { Console.WriteLine("d is called"); return x + 5; }
    private int e(int x) { Console.WriteLine("e is called"); return x + 6; }

} 

16が返されます....

ここに画像の説明を入力

「aが呼び出されました」などのさまざまなメッセージがすべてに出力されるため、すべての関数が起動しますがconsole、最後の関数から返された金額のみが返されますe-バックグラウンドでそれらが返されたが上書きされたと仮定していますか?

4

2 に答える 2

15

質問のようdにマルチキャスト デリゲートがある場合、戻り値はの呼び出しリストの最後のdメソッドからの戻り値です。

一般に、マルチキャスト デリゲートの場合、 return type を使用するのが最も自然voidです。

コンパイラは、あなたが望んでいたことを推測する機会がありませんでした10+2+3+4+5+6。どこにも指定していません。

デリゲートの種類を次のように変更できます。

delegate void del(int xToAdd, ref int sum);

次に、aたとえば、メソッドは次のようになります。

private void a(int x, ref int sum) { Console.WriteLine("a is called"); sum += x + 2; }

マルチキャスト デリゲート インスタンスdは、次のように呼び出されます。

int sum = 0;
d(10, ref sum);
Console.WriteLine(sum);

これが役立つことを願っています。

于 2013-03-05T15:51:52.120 に答える
9

これは、デリゲートの戻り値の型が処理される方法ではありません。何が起こるかというと、すべてのハンドラーが互いに独立して実行され、ランダムに 1 つが選択され (技術的には、最後にサブスクライブされたハンドラーですが、それに依存するべきではありません)、呼び出し元に返されます。デリゲートを呼び出しました。

戻り値を持つイベント (このデリゲートをイベントのように扱っている) を使用しないことを強くお勧めします。この動作は事実上決して望ましいものではありません。戻り値が必要な場合は、デリゲートが常に正確に 1 つの関数にマップされていることを確認することは理にかなっています。

望ましい結果を実際に生成することに関しては、多くのアプローチがありますが、より伝統的なデリゲートのコレクションを使用することをお勧めします。

List<Func<int, int>> functions = new List<Func<int, int>>();
//populate

int result = functions.Aggregate(10, (total, func) => func(total));
于 2013-03-05T15:47:30.280 に答える