【C#】Delegate / Event ~ 入門編 / Delegate ~

■ はじめに

Delegate について、学んでいく

補足:Delegate の英語的意味

 (名) 代表者、使節
 (動) 委任する、代表を立てる

 ■ デリゲート (delegate)

デリゲートを使うと、イベントを作成する(処理を渡す)ことが可能

 * デリゲート : 委譲(=他のものに譲って任せること)
 (AクラスにBクラスのインスタンスを渡すことなく、AクラスがBクラスのメソッドを実行することができる)

 * C言語の関数ポインタのようなもの

 * 主にイベント・ハンドラやコールバック・メソッドとして活用

 ■ 利用手順

1)デリゲートを定義する
2)デリゲートしたいメソッド本体を記述
3)デリゲートの設定
4)メソッドの実行

1)デリゲートを定義する

サンプル

delegate string SampleDelegate(string value);

 ## 2)デリゲートしたいメソッド本体を記述 サンプル

//(別にこれは特別なことはない) 
protected string CaseTrue(string value)
{
     return value + " From CaseTrue!!";
}

3)デリゲートの設定

手順1)で定義したデリゲートに、
手順2)で記述したメソッドを、
デリゲートのオブジェクトとして設定 

サンプル

SampleDelegate obj = new SampleDelegate(this.CaseTrue);

4)メソッドの実行

手順3)で設定したオブジェクトからメソッドを実行 

サンプル

string result = obj("Hello world!");

 ■ デリゲートの追加・削除

 追加

 * 「+演算子」か「+=演算子」を用いる

 削除

 * 「-=演算子」を用いる

 サンプル

// [1] デリゲート定義
delegate void SampleDelegate();

#region [2] メソッド本体
public class ClassSample
{
    public string str = string.Empty;

    public void method1()
    {
        str += " method1 ";
    }
    public void method2()
    {
        str += " method2 ";
    }
    public void method3()
    {
        str += " method3 ";
    }
}
#endregion

private void button1_Click(object sender, EventArgs e)
{
    ClassSample obj = new ClassSample();
    // [3] デリゲートにメソッドを設定
    SampleDelegate obj1 = new SampleDelegate(obj.method1);
    SampleDelegate obj2 = new SampleDelegate(obj.method2);
    SampleDelegate obj3 = new SampleDelegate(obj.method3);
    // [4] デリゲートの追加
    obj1 += obj2;
    obj1 += obj3;
    // [5] メソッドを実行
    obj1();

    this.label1.Text = obj.str;
}

 ■ サンプル

 例1

// [1] デリゲートを定義する
delegate void DelegateMethod(string name);

// [2] デリゲートしたいメソッド本体を記述(別にこれは特別なことはない) 
public static void Method(string name)
{
    Console.WriteLine(string.Format("Hello {0}!", name));
}

private void button1_Click(object sender, EventArgs e)
{
    DelegateMethod methodObject;

    // [3] 手順[1]で定義したデリゲートに、
    //     手順[2]で記述したメソッドを、デリゲートのオブジェクトとして設定 
    methodObject = Method;
    // [4] 手順[3]で設定したオブジェクトからメソッドを実行 
    methodObject("Mike");
}

 例2

デリゲートを呼び出すメソッド 
// [1] デリゲートを定義する
delegate void SampleDelegateMethod();

private void button2_Click(object sender, EventArgs e)
{
    Test.SampleDelegate obj = new Test.SampleDelegate();

    // [3] 手順[1]で定義したデリゲートに、
    //     手順[2]で記述したメソッドを、デリゲートのオブジェクトとして設定 
    SampleDelegateMethod deleObj = new SampleDelegateMethod(obj.Method);

    // [4] 手順[3]で設定したオブジェクトからメソッドを実行 
    deleObj();

    // 出力「 Run Method 」
    this.label1.Text = obj.str;
}
デリゲートしたいメソッド本体を記述したクラス(SampleDelegate.cs) 
namespace Test
{
    public class SampleDelegate
    {
        public string str = string.Empty;

        // [2] デリゲートしたいメソッド本体を記述
        public void Method()
        {
            str += " Run Method ";
        }
    }
}

 例3

・・・
// [1] デリゲート定義
delegate string SampleDelegate(string value);

・・・
#region [2] メソッド本体
protected string CaseTrue(string value)
{
     return value + " From CaseTrue!!";
}
protected string CaseFlase(string value)
{
     return value + " From CaseFlase...";
}
#endregion

SampleDelegate obj;
bool flag = false;

if (flag)
{
    obj = new SampleDelegate(this.CaseTrue); // [3] デリゲートにメソッドCaseTrue()を設定
}
else
{
    obj = new SampleDelegate(this.CaseFlase); // デリゲートにメソッドCaseFlase()を設定
}

Console.Writeln(obj("Hello world!")); // "Hello world! From CaseFlase..."が表示される

 参考資料

http://www.atmarkit.co.jp/fdotnet/csharp_abc/csharp_abc_017/csharp_abc05.html

関連記事

Delegate / Event ~ 入門編 / Event ~
https://dk521123.hatenablog.com/entry/2010/12/25/221009