0

デリゲートと遊んでいて、何が起こっているのかわからない状況になりました。

私のロジックでは、"greetings" デリゲートの呼び出しリストは 2 を返すはずですが、1 を返すだけです。ご覧のとおり、作成したオブジェクトへのデリゲート参照を渡しています。デリゲートが外部からプライベート メソッドを参照できることを確認したかったのですが、唯一の要件は、デリゲートへのメソッドの割り当て中にメソッドにアクセスできることです。

    class Program
    {
        static void Main(string[] args)
        {
            Action greetings = FirstGreeting;

            Test test = new Test();
            test.AddGreeting(greetings);

            Console.WriteLine(greetings.GetInvocationList().Count());

            greetings();

            Console.ReadLine();
        }

        static void FirstGreeting()
        {
            Console.WriteLine("This is the first greeting.");
        }
    }

    class Test
    {
        public void AddGreeting(Action greetings)
        {
            greetings += new Action(SecondGreeting);
        }

        private void SecondGreeting()
        {
            Console.WriteLine("This is the second greeting.");
        }
    }
4

2 に答える 2

4

ご覧のとおり、作成したオブジェクトにデリゲート参照を渡しています。

はい。ただし、次のものを使用しています。

greetings += new Action(SecondGreeting);

これにより、新しいデリゲートが作成されます。既存のデリゲートは変更されません。デリゲートは文字列のように不変です。コードを期待どおりに動作させたい場合は、次を使用する必要があります。

public void AddGreeting(ref Action greetings)
{
    greetings += new Action(SecondGreeting);
}

そしてそれを次のように呼び出します

test.AddGreeting(ref greetings);

(または、Peter の回答に示されているように、新しいデリゲートへの参照を返します。)

何が機能するかについての詳細は、デリゲートとイベントに関する私の記事を参照してください+=

于 2012-04-07T08:27:06.173 に答える
1

私はちょうどあなたのコードを試してみましたが、あなたが何を意味するかを見ることができます. AddGreeting()その時点で呼び出しリストを出力する行をメソッドに追加すると、そこに 2 つのメソッドが表示されます。しかし、Jon Skeet が指摘したように、デリゲートは不変であり、作成された新しい (マルチキャスト) デリゲートを返していません。

メソッドを次のように変更することをお勧めします。

public Action AddGreeting(Action greetings)
{
    return greetings + new Action(SecondGreeting);
}

これにより、正しい呼び出しセットが得られるようになります。

于 2012-04-07T08:31:48.957 に答える