C#のDelegateに関する資料

以下は、C#におけるDelegateの概要と使い方、実例を示す資料です。Delegateは、メソッドを参照するための型安全なオブジェクトであり、コールバックやイベント処理など、柔軟なプログラム設計に役立ちます。


1. Delegateの基本概念

  • Delegateとは
    Delegateはメソッドへの参照を保持するオブジェクトです。関数ポインタのような役割を果たし、型安全であるため、呼び出し先のメソッドのシグネチャ(引数の型と戻り値の型)が一致している必要があります。
  • 主な用途
    • コールバック関数の実装
    • イベントハンドラの実装
    • 複数のメソッドを1つのDelegateに関連付け、まとめて実行(Multicast Delegate)

2. Delegateの宣言と実装

Delegateの宣言

Delegateは、次のように宣言します:

// 戻り値がvoidで、引数がintのメソッドを参照するDelegate
public delegate void MyDelegate(int value);

この例では、MyDelegateは整数を引数に取り、戻り値がないメソッドを参照できるDelegateです。

Delegateのインスタンス化と利用

Delegateのインスタンスを生成し、メソッドを割り当てる例です:

using System;

public class Program
{
    // Delegateの宣言
    public delegate void MyDelegate(int value);

    // Delegateに割り当てるメソッド
    public static void PrintNumber(int number)
    {
        Console.WriteLine("Number: " + number);
    }

    public static void Main()
    {
        // Delegateのインスタンス化とメソッドの割り当て
        MyDelegate del = new MyDelegate(PrintNumber);

        // Delegateの呼び出し
        del(42); // 出力: Number: 42
    }
}

このコードでは、PrintNumberメソッドがMyDelegateに割り当てられ、Delegateを通じてメソッドが呼び出されます。


3. Multicast Delegate

Delegateは複数のメソッドを参照することが可能です。これをMulticast Delegateと呼びます。Delegateに複数のメソッドを追加するには、+=演算子を使用します。

using System;

public class Program
{
    public delegate void MyDelegate(int value);

    public static void PrintNumber(int number)
    {
        Console.WriteLine("Number: " + number);
    }

    public static void PrintDouble(int number)
    {
        Console.WriteLine("Double: " + (number * 2));
    }

    public static void Main()
    {
        MyDelegate del = PrintNumber;
        del += PrintDouble; // 追加でPrintDoubleを登録

        // Delegateを呼び出すと、登録されたすべてのメソッドが実行される
        del(10);
        // 出力:
        // Number: 10
        // Double: 20
    }
}

この例では、1つのDelegateに2つのメソッドを登録しており、Delegateの呼び出し時に両方のメソッドが実行されます。


4. イベントとの連携

Delegateは、イベント処理の基盤として利用されます。C#では、eventキーワードと共にDelegateが用いられ、イベントの発生時に関連付けられたメソッドを呼び出します。

イベントの基本的な例

using System;

public class Button
{
    // イベントハンドラとしてのDelegateを定義
    public delegate void ClickHandler(object sender, EventArgs e);

    // Clickイベントの宣言
    public event ClickHandler Click;

    // ボタンがクリックされたときに呼び出されるメソッド
    public void OnClick()
    {
        if (Click != null)
        {
            Click(this, EventArgs.Empty);
        }
    }
}

public class Program
{
    public static void Main()
    {
        Button button = new Button();

        // イベントにハンドラを登録
        button.Click += Button_Click;

        // ボタンのクリックをシミュレーション
        button.OnClick();
    }

    // イベントハンドラの定義
    private static void Button_Click(object sender, EventArgs e)
    {
        Console.WriteLine("Button was clicked!");
    }
}

この例では、Buttonクラス内でClickイベントを定義し、イベントが発生した際にButton_Clickメソッドが呼び出されます。


5. Delegateとラムダ式

C#では、ラムダ式を用いることで、より簡潔にDelegateを定義することができます。

using System;

public class Program
{
    public delegate int Calculate(int a, int b);

    public static void Main()
    {
        // ラムダ式を使用してDelegateのインスタンス化
        Calculate add = (a, b) => a + b;
        Calculate multiply = (a, b) => a * b;

        Console.WriteLine("Addition: " + add(3, 4));      // 出力: Addition: 7
        Console.WriteLine("Multiplication: " + multiply(3, 4)); // 出力: Multiplication: 12
    }
}

このように、ラムダ式はDelegateのインスタンス化をより直感的かつ簡潔に行える方法として広く利用されています。


6. まとめ

  • Delegateの役割: メソッド参照を保持し、型安全なコールバックやイベント処理を実現する。
  • 使い方: Delegateの宣言、インスタンス化、メソッドの登録、呼び出しが基本。
  • Multicast: 複数のメソッドを1つのDelegateに登録することで、連続して実行可能。
  • イベント連携: Delegateを活用することで、イベントハンドリングの仕組みを実装できる。
  • ラムダ式との併用: コードの簡素化と可読性向上のために、ラムダ式がよく使われる。

DelegateはC#の強力な機能の一つであり、柔軟で拡張性のあるプログラム設計を実現するために重要な役割を担います。これらの基本を押さえて、より高度なアプリケーション開発に活かしてください。

C#,イベント

Posted by hidepon