web-dev-qa-db-ja.com

C#-匿名のデリゲート

匿名メソッドのように、「delegate」キーワードを使用して宣言しているデリゲートは匿名のデリゲートですか?

namespace Test
{
    public delegate void MyDelegate();
    class Program
    {
        static void Main(string[] args)
        {
            DelegateTest tst = new DelegateTest();
            tst.Chaining();
            Console.ReadKey(true);
        }
    }

    class DelegateTest
    {
        public event MyDelegate del;

        public void Chaining()
        {
            del += delegate { Console.WriteLine("Hello World"); };
            del += delegate { Console.WriteLine("Good Things"); };
            del += delegate { Console.WriteLine("Wonderful World"); };
            del();
        }
    }
}
17
user160677

この例のデリゲートコレクションは、いくつかの匿名メソッドを指しています。デリゲートは「単なるメソッドポインタ」です。実際のメソッドを指しているのか、匿名メソッドを指しているのかは関係ありません。

http://msdn.Microsoft.com/en-us/library/0yw3tz5k(VS.80).aspx を参照してください。

19
Brian Rasmussen

「匿名デリゲート」のようなものはありません(つまり、C#仕様、または私が知っている他の.NET関連の仕様で認識されている用語ではありません)。

匿名メソッドとラムダ式を含む無名関数があります。

あなたのコードは、単純な古い無名メソッドを示しています-それらはareラムダ式にはない1つの機能を使用しています:パラメーターを気にしないときにパラメーターをまったく表現しない機能。

23
Jon Skeet

正解です。イベントに多数の匿名メソッドを割り当てました。

新しいバージョンのc#を使用している場合は、ラムダでも同様のことができます。例えば:

class DelegateTest
{
    public event Action del;

    public void Chaining()
    {
        del += () => Console.WriteLine("Hello World");
        del += () => Console.WriteLine("Good Things");
        del += () => Console.WriteLine("Wonderful World");
        del();
    }
}
4
Greg D

あなたの代理人は匿名ではありません。それはMyDelegateと呼ばれます。 CLRのデリゲートは、System.MulticastDelegateから派生したクラスであり、この場合はMyDelegateと呼ばれます。 MulticastDelegateから直接派生することはできません。C#コンパイラが停止します。

デリゲートをdelに割り当てるコードでは、デリゲートのタイプ/名前は、タイプMyDelegateのイベントとしてdelを宣言したため、コンパイラーによって推測されます。

2
Petar Repac

はい、彼らは匿名のデリゲートです(または、より具体的には、 匿名メソッドを呼び出すデリゲート )。

2
Lucero

はい。匿名のデリゲートは名前で直接参照できないため、delegate(){}構文を使用すると匿名になります。

2
barkmadley

彼らは匿名メソッドへのデリゲートです。これは、匿名メソッドを作成する1つの方法であり、.NET2.0以降で使用可能でした。 .NET 3.0では、記述が簡単なラムダ式を使用することもできます(ただし、同じコードにコンパイルします)。それが「匿名メソッド」の意味だと思います。しかし、実際には、それらは同じものです。

1
Vilx-