2011-07-14 11 views
0

可能性の重複:C#ので
What is Delegate?C#のデリゲートの質問

、デリゲートは、メソッド名とタイプ名の両方として見ることができます。私の理解は正しいのですか?

like "doShow [] items = new doShow [3];" dowShowは型名です。以下のような "doshow(新しいClass1の()....)" dosShowは、メソッド名である/

私はここにコードを読み取ることで、この結論を得る:

public class TestDelegate 
{ 
    // define a datatype as a method taking a string returning void 
    public delegate void doShow(String s); 

    public static void Main(string[] args) 
    { 
     // make an array of these methods 
     doShow[] items = new doShow[3]; 

     items[0] = new doShow(new Class1().show); 
     items[1] = new doShow(new Class2().display); 
     items[2] = new doShow(Class3.staticDisplay); 

     // call all items the same way 
     for(int i = 0; i < items.Length; i++) { 
      items[i]("Hello World"); 
     } 
    } 
} 
+3

方法が記載されているタイプと考えます。実際の方法ではありません。デリゲートは、*メソッドが呼び出される(または匿名メソッド)と述べています。疎く言えば、強く型付けされた関数ポインタだと言えます。 – vcsjones

+0

簡単に言えば、デリゲートをメソッドシグネチャのコンテナとして想定できます。あなたが呼び出したいメソッドへの目に見えないリンクのようなものです。 – AbrahamJP

答えて

5

はい。デリゲート型は型です。デリゲート型のインスタンスは、(メソッド構文myDelegate(arg1, arg2))を持つメソッドのように呼び出すことができます。デリゲートは強く型付けされた(したがって型)メソッドポインタと考えることができます。

0

私が間違っていない場合、デリゲートは常に型ですが、インスタンスは同じシグネチャのメソッドに関連付けることができます。これはあなたが上記のコードで見ているものです。

doShowは型であり、そのインスタンス(new演算子を使用)は、デリゲートのコンストラクタにパラメータとして渡されるメソッドに関連付けられます。

ビジェイ

0

あなたも、あなたはずっと同じ方法でそれらの使用インスタンスをすることができますが、「メソッド」としてデリゲートの自分を考えるべきではありません。彼らは方法ではなく、タイプです。

これらは特別な型で、そのインスタンスにはメソッドへの参照を保持できます。デリゲートに与えた "名前"は、メソッド名ではなく、クラス名、列挙型などの型名です。この型はメソッドと同じように、呼び出すことによって実行できるオブジェクトを記述するだけです。

それはいくつかの理由のために、デリゲートと、「メソッド名」の区別を行うことが重要です。

  1. を最も重要なこと - あなたは、関連するメソッドを呼び出すためにデリゲート型名自体を使用しないでください。インスタンス名を使用します。あなたのサンプルを考えると、あなたが言うことができません。

    doShow("Hi"); 
    
  2. デリゲートは名前がない匿名メソッドへの参照を保持することができ、のような:

    doShow s = delegate (string s) { Console.WriteLine(s); }; 
    
  3. デリゲートAへの参照を保持することができます匿名デリゲートメソッドを記述するために内部ちょうど別の方法が、表面的あるラムダ式は、完全に違って見える:

    doShow s = x => Console.WriteLine(x); 
    
  4. マルチキャストデリゲート(イベントハンドラなど)は、名前付きメソッド、匿名メソッド、またはlambasの任意の組み合わせを含む、一度に複数のメソッドへの参照を保持できます。

    myObject.MyEvent += ObjectEvent; 
    myObject.MyEvent += delegate (object sender, EventArgs e) { Console.WriteLine("Hi"); } 
    myObject.MyEvent += (sender, e) => Console.WriteLine("Hi again.");