デリゲートは、.NET で 遅延バインディング メカニズムを提供します。 遅延バインディングとは、呼び出し元がアルゴリズムの一部を実装する少なくとも 1 つのメソッドも提供するアルゴリズムを作成することを意味します。
たとえば、天文学アプリケーションで星の一覧を並べ替えるとします。 これらの星は、地球からの距離、星の大きさ、または認識される明るさで並べ替えることができます。
いずれの場合も、Sort() メソッドは基本的に同じことを行います。いくつかの比較に基づいてリスト内の項目を配置します。 2 つの星を比較するコードは、並べ替え順序ごとに異なります。
この種のソリューションは、ソフトウェアで50年の間使用されてきました。 C# 言語デリゲートの概念では、ファースト クラスの言語サポートと、概念に関する型の安全性が提供されます。
このシリーズの後半で説明するように、このようなアルゴリズム用に記述する C# コードはタイプ セーフです。 コンパイラは、型が引数と戻り値の型と一致することを保証します。
関数ポインターは 、呼び出し規則をより詳細に制御する必要がある同様のシナリオをサポートします。 デリゲートに関連付けられているコードは、デリゲート型に追加された仮想メソッドを使用して呼び出されます。 関数ポインターを使用すると、さまざまな規則を指定できます。
デリゲートの言語設計目標
言語デザイナーは、最終的にデリゲートになった機能のいくつかの目標を列挙しました。
チームは、遅延バインディング アルゴリズムに使用できる共通言語コンストラクトを必要としていました。 デリゲートを使用すると、開発者は 1 つの概念を学習し、さまざまなソフトウェアの問題で同じ概念を使用できます。
次に、チームはシングル メソッド呼び出しとマルチキャスト メソッド呼び出しの両方をサポートしたいと考えました。 (マルチキャスト デリゲートは、複数のメソッド呼び出しを連結するデリゲートです。 このシリーズの後半に例が表示されます)。)
チームは、開発者がすべての C# コンストラクトに期待するのと同じタイプ セーフをデリゲートがサポートすることを望んでいました。
最後に、イベント パターンは、デリゲートまたは遅延バインディング アルゴリズムが役立つ特定のパターンの 1 つであるとチームが認識しました。 チームは、デリゲートのコードが .NET イベント パターンの基礎を提供できることを確認したいと考えていました。
その作業の結果は、C# と .NET でのデリゲートとイベントのサポートでした。
このシリーズの残りの記事では、言語機能、ライブラリのサポート、およびデリゲートとイベントを操作するときに使用される一般的なイディオムについて説明します。 以下について説明します。
-
delegate
キーワードと、それが生成するコード。 -
System.Delegate
クラスの機能と、それらの機能の使用方法。 - タイプ セーフなデリゲートの作成方法。
- デリゲートを介して呼び出すことができるメソッドを作成する方法。
- ラムダ式を使用してデリゲートとイベントを操作する方法。
- デリゲートが LINQ の構成要素の 1 つになる方法。
- デリゲートが .NET イベント パターンの基礎となるしくみと、その違い。
始めましょう。
.NET