C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#のデリゲートとは?仕組みと基本的な使い方をわかりやすく解説

C#におけるデリゲート(delegate)とは、メソッドへの参照を保持できる特殊な型です。デリゲート変数には特定のメソッドへの参照が格納され、その参照先はプログラムの実行時に動的に変更することも可能です。

この特性を活かすことで、同じデリゲート変数を使いながら、状況に応じて異なるメソッドを呼び出す柔軟な設計が実現できます。

デリゲートの主な用途

デリゲートは、次のような場面で特に役立ちます。

  • イベント処理の実装:ボタンクリックなどのイベント発生時に、登録されたメソッドを呼び出す仕組みとして利用されます。
  • コールバックメソッド:非同期処理の完了時など、後から指定したメソッドを呼び出したい場合に使用されます。

なお、すべてのデリゲートは暗黙的にSystem.Delegateクラスから派生しています。

デリゲートの宣言方法

デリゲートは以下の構文で宣言します。

delegate <戻り値の型> <デリゲート名> <パラメーターリスト>

宣言したデリゲートと同じシグネチャ(戻り値の型とパラメーターの構成)を持つメソッドであれば、どのメソッドでも参照先として割り当てることができます。

C#デリゲートのサンプルコード

ここでは、コンソールに出力するメソッドとファイルに書き込むメソッドを、1つのデリゲート経由で切り替えて呼び出す例を見てみましょう。

using System;
using System.IO;

namespace DelegateAppl {

    class PrintString {
        static FileStream fs;
        static StreamWriter sw;

        // デリゲートの宣言
        public delegate void printString(string s);

        // コンソールに出力するメソッド
        public static void WriteToScreen(string str) {
            Console.WriteLine("The String is: {0}", str);
        }

        // ファイルに書き込むメソッド
        public static void WriteToFile(string s) {
            fs = new FileStream("c:\\message.txt",
            FileMode.Append, FileAccess.Write);
            sw = new StreamWriter(fs);
            sw.WriteLine(s);
            sw.Flush();
            sw.Close();
            fs.Close();
        }

        // デリゲートを引数に受け取り、必要なメソッドを呼び出すメソッド
        public static void sendString(printString ps) {
            ps("Hello World");
        }

        static void Main(string[] args) {
            printString ps1 = new printString(WriteToScreen);
            printString ps2 = new printString(WriteToFile);
            sendString(ps1);
            sendString(ps2);
            Console.ReadKey();
        }
    }
}

コードのポイント

  • printStringという名前のデリゲートを宣言し、文字列を引数に取るvoid型メソッドを参照できるようにしています。
  • Mainメソッド内で、WriteToScreenWriteToFileという2つのメソッドをそれぞれ別のデリゲート変数(ps1・ps2)に割り当てています。
  • sendStringメソッドはデリゲートを引数として受け取り、渡されたデリゲートが参照するメソッドを実行します。

実行結果

上記のコードを実行すると、コンソールには次のように表示されます。

The String is: Hello World

同時に、c:\message.txtファイルにも「Hello World」という文字列が追記されます。このように、同一のsendStringメソッドでありながら、渡すデリゲートを変えるだけで処理内容(出力先)を切り替えられるのがデリゲートの強力な点です。

まとめ

デリゲートは「メソッドを変数のように扱う」ためのC#の重要な機能です。イベントやコールバックの基盤となる仕組みであり、LINQで多用されるラムダ式やFunc/Actionといった汎用デリゲートの理解にもつながります。まずは本記事のサンプルコードを実際に動かして、挙動を確認してみると良いでしょう。

  1. C#の名前空間(namespace)とは?定義方法と基本的な使い方を解説

    名前空間とは名前空間(namespace)とは、ある一連の名前を別の一連の名前から分離して管理するための仕組みです。大規模なプロジェクトでは、複数の開発者が同じ名前のクラスやメソッドを作成することがあり、名前の衝突(コンフリクト)が発生する可能性があります。名前空間を使うことで、こうした衝突を防ぎ、コードを論理的に整理できます。また、.NET Framework が提供する System なども名前空間の一つであり、標準ライブラリの機能はすべて名前空間によって分類・管理されています。名前空間の定義方法名前空間の定義は、namespace キーワードで始まり、その後に名前空間名を続けて記述します

  2. C#のデリゲートとは?仕組みと基本的な使い方をわかりやすく解説

    C#におけるデリゲート(delegate)とは、メソッドへの参照を保持できる特殊な型です。デリゲート変数には特定のメソッドへの参照が格納され、その参照先はプログラムの実行時に動的に変更することも可能です。この特性を活かすことで、同じデリゲート変数を使いながら、状況に応じて異なるメソッドを呼び出す柔軟な設計が実現できます。デリゲートの主な用途デリゲートは、次のような場面で特に役立ちます。イベント処理の実装:ボタンクリックなどのイベント発生時に、登録されたメソッドを呼び出す仕組みとして利用されます。コールバックメソッド:非同期処理の完了時など、後から指定したメソッドを呼び出したい場合に使用されます