C# デリゲートの基本と現在の使い方

概要

デリゲート(Delegate)は、C#における「メソッドへのポインタ」のような仕組みで、メソッドを動的に参照し、呼び出すために使用されます。本資料では、デリゲートの基本概念、使用例、現代的な使い方(ラムダ式や組み込みデリゲート)を解説します。


1. デリゲートとは?

デリゲートは、メソッドの参照を保存して呼び出すための型です。動的にどのメソッドを実行するかを変更できるため、柔軟なプログラム設計が可能です。

特徴

  • メソッドの参照: 特定のシグネチャを持つメソッドを変数として扱える。
  • イベント処理: デリゲートはイベントハンドリングの基盤。
  • 柔軟性: 実行時にメソッドを動的に切り替えられる。

2. 基本構文

デリゲートの基本的な構文を以下に示します。

デリゲート型の定義

// デリゲート型を定義
delegate int Operation(int x, int y);

上記の例では、引数が int xint y の2つで、戻り値が int 型のメソッドを格納できるデリゲート型 Operation を定義しています。


3. デリゲートの基本例

以下は、デリゲートの基本的な使い方の例です。

例: カスタムデリゲート

// メソッドを定義
int Add(int a, int b) => a + b;
int Multiply(int a, int b) => a * b;

// デリゲートを利用
Operation op;

op = Add;
Console.WriteLine(op(3, 5)); // 出力: 8

op = Multiply;
Console.WriteLine(op(3, 5)); // 出力: 15

4. 現代的なデリゲートの使い方

C#では、組み込みデリゲート型ラムダ式を使うことで、デリゲートを簡単に扱えるようになっています。

4.1 組み込みデリゲート型

  • Func: 戻り値のあるメソッド用。
  • Action: 戻り値のないメソッド用。
  • Predicate: 戻り値が bool 型のメソッド用。

例: Func

Func<int, int, int> add = (a, b) => a + b;
Console.WriteLine(add(3, 5)); // 出力: 8

例: Action

Action<string> greet = name => Console.WriteLine($"Hello, {name}!");
greet("Hidemaki"); // 出力: Hello, Hidemaki!

例: Predicate

Predicate<int> isEven = x => x % 2 == 0;
Console.WriteLine(isEven(4)); // 出力: True

4.2 ラムダ式

ラムダ式を使用することで、デリゲートの記述を簡潔化できます。

Func<int, int, int> multiply = (a, b) => a * b;
Console.WriteLine(multiply(3, 5)); // 出力: 15

5. 実践的な使用例

5.1 リストの操作

デリゲートを使ってリストを操作できます。

var numbers = new List<int> { 1, 2, 3, 4, 5 };

// 偶数だけをフィルタリング
var evenNumbers = numbers.FindAll(x => x % 2 == 0);

evenNumbers.ForEach(Console.WriteLine); // 出力: 2, 4

5.2 カスタムソート

デリゲートを使ってカスタムソートを行います。

var names = new List<string> { "Bob", "Alice", "Charlie" };

// 名前の長さでソート
names.Sort((x, y) => x.Length.CompareTo(y.Length));

names.ForEach(Console.WriteLine);
// 出力:
// Bob
// Alice
// Charlie

5.3 イベント処理

デリゲートはイベントハンドリングでも使用されます。

// 擬似的なボタンのクリックイベント
Action onClick = () => Console.WriteLine("Button clicked!");

onClick(); // 出力: Button clicked!

6. デリゲートのメリット

柔軟性

デリゲートを使うことで、異なる処理を動的に切り替えることが可能です。

再利用性

デリゲートを用いることで、コードの汎用性が向上します。

簡潔性

ラムダ式や組み込みデリゲート型を使えば、コードを簡潔に記述できます。

イベント処理

GUIアプリケーションのイベント処理でデリゲートは不可欠です。


7. まとめ

  • デリゲートは、メソッドの参照を格納し動的に呼び出す仕組み
  • 現代的なC#では、組み込みデリゲート型(Func, Action, Predicate)ラムダ式を利用するのが主流。
  • 実用的な場面として、リスト操作やカスタムソート、イベント処理などが挙げられる。

デリゲートの理解は、イベント処理やLINQなどC#の多くの機能を活用する基礎となります。簡単なサンプルコードから始めて、柔軟に活用できるようになりましょう!

デリゲート

Posted by hidepon