【C#】デリゲートの処理イメージ

下記のようにデリゲートを宣言したとします。

public delegate void MyProcess(string msg);

また、実際の処理を行う関数をMyClassのRealProcessというメソッドに実装したとします。

public class MyClass
{
    public void RealProcess(string msg)
    {
        MessageBox.Show(msg);
    }
}

それらをボタンクリックで次のようにして使用したとします。

private void button3_Click(object sender, EventArgs e)
{
    var myCls = new MyClass();
    var process = new MyProcess(myCls.RealProcess);
    process("あいうえお");
}

上記は、『process(“あいうえお”);』という場所でMyClassのRealProcessメソッドが処理されます。

【上記処理の内部動作イメージ】

デリゲートの宣言、『public delegate void MyProcess(string msg);』は、下記のクラスを作ることになるようです。

public class MyProcess : System.MulticastDelegate
{
    private Object _target;
    private IntPtr _methodPtr;

    public MyProcess(Object obj, IntPtr method)
    {
        this._target = obj;
        this._methodPtr = method;
    }

    public overide void Invoke(string msg)
    {
        _targetインスタンスの_methodPtrが示す関数を呼び出す処理
    }
}

ボタンクリック時のコードの中で『var process = new MyProcess(myCls.RealProcess);』と書いてMyClassのRealProcessメソッドと関連付けました。
これは、下記のコードを書いたイメージになるようです・

var process = new MyProcess(myClass,RealProcessメソッドへのポインタ);

また、『process(“あいうえお”);』というコードは下記のコードを書いたことになるようです。

process.Invoke("あいうえお");

内部的な処理の概要を知るまで、JavaScriptのように関数を変数に代入して使うやり方と混ざり合っていまいち理解できていませんでしたが、やっと頭の中が整理できました。