まるノート

備忘録も兼ねて、様々なお役立ち情報をまとめています。

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

はじめに

最近C#の学習をはじめました。筆者はJavaを学習したことがあり、C#はJavaとおおむね同じような記法だという印象でした。しかしいくつかJavaにはない考え方が出ててきて戸惑った点がありました。

C#ではデリゲートという考え方に基づいた、ラムダ式といった記法やイベントハンドラといった処理が頻繁に登場します。まずは基本になるデリゲートについてまとめてみました。


デリゲートって何?

簡潔に表すと、デリゲートとはメソッドを代入できる変数のことです。

以下のように宣言し、デリゲート型として一つの型として扱われる。
delegate 戻り値の型 デリゲート型名(引数リスト);
ex: delegate int DelegateName(int x, int y);

代入できるのは、宣言した時と同じ引数、同じ戻り値のメソッドです。

繰り返しになりますが、int x, int yを代入するのではなく、int x, int yを引数にもつメソッドを代入します。


デリゲートはどんな時に使うのか?使うと何が嬉しいか?

デリゲートを使わない例

まずは以下のようなメソッドをデリゲートを使わない例として考えます。

void Hoge()
{
    for (int n = 1; n <= 100; i++)
    {
        if (n % 3 == 0) Console.WriteLine(i);
    }
}


このメソッドを実行すると3の倍数が順に出力されます。

namespace Sample
{
    class DeligateTest
    {
        static void Main()
        {
            DeligateTest.Hoge();
        }

        static void Hoge()
        {
            for (int n = 1; n <= 100; n++)
            {
                if (n % 3 == 0) Console.WriteLine(n);
            }
        }
    }
}


デリゲートを使った書き方

ここから、デリゲートを使う場合はどのような書き方をすれば良いか、順に記載します。

まず、以下のようなデリゲートを宣言します。

// 整数 n がある条件を満たすときだけ true を返すデリゲート。
delegate bool testDelegate(int n);

デリゲートに代入するメソッドは以下とします。

// nが3で割り切れる場合にTrueを返すメソッド
static bool MultipleOf3(int n) { return (n % 3 == 0); }


更に、デリゲートを引数にとるメソッドを用意します。

static void Hoge(testDelegate del)
{
    for (int n = 1; n <= 100; n++)
    {
        if (del(n)) Console.WriteLine(n);
    }
}


最後に、全体を書き直すと以下のようになります。

namespace Sample
{
    // デリゲートを宣言
    delegate bool testDelegate(int n);

    class DeligateTest
    {
        static void Main()
        {   
            // 引数に実行したいメソッドを入れ、new つけてインスタンス化して使用する。
            Hoge(new testDelegate(MultipleOf3));
        }

        // nが3で割り切れる場合にTrueを返すメソッド
        static bool MultipleOf3(int n) { return (n % 3 == 0); }

        static void Hoge(testDelegate del)
        {
            for (int n = 1; n <= 100; n++)
            {
                if (del(n)) Console.WriteLine(n);
            }
        }
    }
}



引数nがある条件に一致した場合にTrueを返す関数であればどんな条件にも変更・切替えが可能です。
(今回の例だと、全然メリットが実感できなと思いますが...)

new testDelegate(この部分を変更したいメソッドに置き換える。)


例えば、5の倍数で割り切れる数字を出力したい場合や、3と5で割り切れる場合を条件にしたい場合などです。

static bool MultipleOf3(int n) { return (n % 3 == 0); }
static bool MultipleOf5(int n) { return (n % 3 == 0); }
static bool MultipleOf3And5(int n) { return (n % 3 == 0 && n % 5 == 0);}


以上がデリゲートの基本的な記述方法になります。C#のコードであれば様々な所で登場しますので、頭に入れておいた方が良いと思います。
デリゲートを使う恩恵が特に受けられるかどのような処理なのか、といったメリットはまた別の記事で記載したいと思います。