【C#】デリゲートについて

概要

  • デリゲートに関してまとめる。
    • 何回目だろうか。
    • きっとそれだけ分かりにくい内容なのかもしれない。
      • 実際に手を動かさなければ覚えられない。

delegate

概要

  • delegateとは、メソッドを参照するための型(変数)である!
    • 端的に言えば、変数valueにメソッドsomeMethodを格納する。

文法(C#)

  • 変数宣言
delegate 戻り値の型 デリゲート型名(引数リスト);
  • インスタンス化
デリゲート型名 変数名 = new デリゲート型名(メソッド名);

サンプル

最も基本的なデリゲート

using System;

class Sample1{
    // delegate変数の宣言
    private delegate MyDelegate(string arg1);

    /*
     * メインメソッド
     */
    public static void Main(){
        // 処理を変数に格納
        MyDelegate _myDelegate = new MyDelegate(SomeMethod);

        // 格納した処理を使用
        _myDelegate("デリゲートテスト");
    }

    /*
     * 引数1の値を出力する
     */
    public void SomeMethod(string msg){ Console.WriteLine(msg); }
}
  • 出力結果
デリゲートテスト

暗黙の型変換

  • 下記で暗黙の型変換が可能
デリゲート型名 変数名 = メソッド名;
using System;

class Sample2{
    // delegate変数の宣言
    private delegate void MyDelegate(string arg1);

    /*
     * メインメソッド
     */
    public static void Main(){
        // 処理を変数に格納
        MyDelegate _myDelegate =SomeMethod;

        // 格納した処理を使用
        _myDelegate("暗黙の型変換によるデリゲートテスト");
    }

    /*
     * 引数1の値を出力する
     */
    public static void SomeMethod(string msg){ Console.WriteLine(msg); }
}
  • 実行結果
暗黙の型変換によるデリゲートテスト

インスタンスメソッドの代入

  • デリゲートにはクラスメソッドとインスタンスメソッド
    • クラスメソッド(staticメソッド)
    • インスタンスメソッド(object.メソッド名()で呼ばれるメソッド)
using System;

/*
 * メインクラス
 */
class Sample3{
    private delegate void MyDelegate();

    public static void Main(){
        Person _person = new Person("John");
        MyDelegate _myDelegate = new MyDelegate(_person.ShowName);
        _myDelegate();
    }
}

/*
 * Personクラス
 */
public class Person{
    private string name;

    // コンストラクタ
    public Person(string name) {
        this.name = name;
    }

    // サンプルメソッド
    public void ShowName(){
        Console.WriteLine("My Name is {0}",this.name);
    }
}
  • 出力結果
My Name is John

マルチキャストデリゲート(複数メソッドの代入)

using System;

/*
 * メインクラス
 */
class Sample3{
    private delegate void MyDelegate();

    public static void Main(){
        Person _person = new Person("John");
        Person _person2 = new Person("Bob");

        MyDelegate _myDelegate = new MyDelegate(_person.ShowName);
        _myDelegate += new MyDelegate(_person2.ShowName);
        _myDelegate += new MyDelegate(Echo);
        _myDelegate();
    }

    public static void Echo(){
        Console.WriteLine("Echo Method!");
    }
}

/*
 * Personクラス
 */
public class Person{
    private string name;

    // コンストラクタ
    public Person(string name) {
        this.name = name;
    }

    // サンプルメソッド
    public void ShowName(){
        Console.WriteLine("My Name is {0}",this.name);
    }
}
  • 実行結果
My Name is John
My Name is Bob
Echo Method!

非同期処理

  • ThreadPoolを使用することで、非同期呼び出しを使用したマルチスレッド処理を行うことが可能。
文法
// 非同期処理の開始
IAsyncResult BeginInvoke(引数リスト…, AsyncCallback callback, object state);
int EndInvoke(引数リスト…, IAsyncResult ar);
using System;
using System.Threading;

class Sample5{
    private delegate void MyDelegate();
    static void Main(){
        MyDelegate _myDelegate = SomeMethod;
        // 非同期処理の開始
        IAsyncResult ar = _myDelegate.BeginInvoke(null,null);

        for (int i=0; i<5; i++){
            Thread.Sleep(100);
            Console.WriteLine("Main ({0})",i);
        }

        // 非同期処理の終了を待つ。
        _myDelegate.EndInvoke(ar);

        Console.WriteLine("End");
    }

    private static void SomeMethod(){
        for (int i=0;i<5;i++){
            Thread.Sleep(100);
            Console.WriteLine("SomeMethod1 ({0})",i);
        }
    }
}
  • 実行結果
SomeMethod1 (0)
Main (0)
SomeMethod1 (1)
Main (1)
Main (2)
SomeMethod1 (2)
SomeMethod1 (3)
Main (3)
SomeMethod1 (4)
Main (4)
End

参考サイト

カテゴリーC#

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です