delegate(依頼)とevent(イベント)(1)について詳しく検討する


delegate(1)
 
C++、Pascal、その他の言語では、関数ポインタの概念がサポートされており、実行時に呼び出す関数を選択できます.
Javaは、関数ポインタ機能を持つ構造を提供しませんが、C#はこの構造を提供します.Delegateクラスを使用すると、依頼インスタンスは呼び出し可能なエンティティに属するメソッドをカプセル化できます.インスタンスメソッドの場合、委任はクラスを含むインスタンスとそのインスタンス上のメソッドから構成されます.静的メソッドの場合、呼び出し可能エンティティはクラスとクラス上の静的メソッドから構成されます.したがって、委任は任意のオブジェクトの関数を呼び出すために使用でき、委任はオブジェクト向けであり、タイプが安全であり、安全である.
委任の定義と使用には、宣言、インスタンス化、呼び出しの3つのステップがあります.
delegate void Del1();

その後、この委任参照を使用してvoidを返し、パラメータを持たない関数を返すことができます.
同様に、文字列パラメータを持ちlong型の結果を返す関数に委任を作成するには、次の構文を使用します.
delegate long Del2(string s);

次に、次のように、この依頼を署名付きの任意の方法に割り当てることができます.
Del2 d;
d = DoWork;

DoWorkの署名は次のとおりです.
public static long DoWork(string name)

Delegateオブジェクトは可変ではありません.つまり、それらに一致する署名を設定した後、署名を変更することはできません.ただし、他のメソッドに同じ署名がある場合は、そのメソッドを指すこともできます.この例では、dは新しい委任オブジェクトに再割り当てされるため、dはDoMoreWorkメソッドを呼び出す.この操作は、DoWorkとDoMoreWorkが同じ署名を持っている場合にのみ実行できます.
Del operation;                 //       
operation = Add;      //          
long sum = operation(11, 22);  //     

 
次のコードは、委任の作成、インスタンス化、呼び出しを示します.
public class MathClass
{
    public static long Add(int i, int j)       // static
    {
        return (i + j);
    }

    public static long Multiply (int i, int j)  // static
    {
        return (i * j);
    }
}

class TestMathClass
{
    delegate long Operation(int i, int j);  

    static void Main()
    {
        Operation opr;          
        opr = MathClass.Add;       //         
      long sum = operation(11, 22);             //          

     opr = MathClass.Multiply;  
        long product = operation(30, 40);        
        System.Console.WriteLine("11 + 22 = " + sum);
        System.Console.WriteLine("30 * 40 = " + product);
    }
}

 
これらの例はMSDNから来ており、多くの人が私と同じように疑問を持っていると信じています.コンパイラはどのように依頼を実現しますか.次(http://canbeatle.iteye.com/blog/686201)ILDASMツールを使用してdelegateの実装方法を確認します.