C# デリゲートの基本と現在の使い方
概要
デリゲート(Delegate)は、C#における「メソッドへのポインタ」のような仕組みで、メソッドを動的に参照し、呼び出すために使用されます。本資料では、デリゲートの基本概念、使用例、現代的な使い方(ラムダ式や組み込みデリゲート)を解説します。
1. デリゲートとは?
デリゲートは、メソッドの参照を保存して呼び出すための型です。動的にどのメソッドを実行するかを変更できるため、柔軟なプログラム設計が可能です。
特徴
- メソッドの参照: 特定のシグネチャを持つメソッドを変数として扱える。
- イベント処理: デリゲートはイベントハンドリングの基盤。
- 柔軟性: 実行時にメソッドを動的に切り替えられる。
2. 基本構文
デリゲートの基本的な構文を以下に示します。
デリゲート型の定義
// デリゲート型を定義
delegate int Operation(int x, int y);
上記の例では、引数が int x
と int 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#の多くの機能を活用する基礎となります。簡単なサンプルコードから始めて、柔軟に活用できるようになりましょう!
ディスカッション
コメント一覧
まだ、コメントがありません