デリゲートの概要Introduction to Delegates

デリゲートは、.NET における "遅延バインディング" のメカニズムです。Delegates provide a late binding mechanism in .NET. 遅延バインディングとは、皆さんが作成するアルゴリズムについて、その一部を実装するメソッドを呼び出し元からも少なくとも 1 つ与えることを意味します。Late Binding means that you create an algorithm where the caller also supplies at least one method that implements part of the algorithm.

たとえば天文学アプリケーションで、一連の星を並べ替えることを考えてみましょう。For example, consider sorting a list of stars in an astronomy application. 星の並べ替え基準には、地球からの距離や星の等級、知覚的な明るさを選ぶことができます。You may choose to sort those stars by their distance from the earth, or the magnitude of the star, or their perceived brightness.

いずれの場合も、Sort() メソッドが行うことは基本的に同じです。つまり何らかの比較に基づいて一連の項目を整列します。In all those cases, the Sort() method does essentially the same thing: arranges the items in the list based on some comparison. しかし、2 つの星を比較するコードは、並べ替えの基準によって異なります。The code that compares two stars is different for each of the sort orderings.

ソフトウェアには、この種の手法が半世紀にわたって使用されてきました。These kinds of solutions have been used in software for half a century. C# 言語のデリゲートの概念は、きわめて優れた言語機能と、その概念を中心にしたタイプ セーフ機能を実現します。The C# language delegate concept provides first class language support, and type safety around the concept.

本シリーズの中で後述しているように、このようなアルゴリズム向けに記述された C# コードはタイプ セーフであり、引数や戻り値の型については、言語規則とコンパイラの機能を使用して型の一致が保証されます。As you'll see later in this series, the C# code you write for algorithms like this is type safe, and uses the language rules and the compiler to ensure that the types match for arguments and return types.

同様のシナリオで、呼び出し規則をより細かく制御する必要がある場合のために、関数ポインターが C# 9 に追加されました。Function pointers were added to C# 9 for similar scenarios, where you need more control over the calling convention. デリゲートに関連付けられたコードは、デリゲート型に追加された仮想メソッドを使用して呼び出されます。The code associated with a delegate is invoked using a virtual method added to a delegate type. 関数ポインターを使用して、さまざまな規則を指定できます。Using function pointers, you can specify different conventions.

デリゲートの言語上の設計目標Language Design Goals for Delegates

最終的にデリゲートとなる機能を実現するにあたって、言語の設計者たちはさまざまな目標を設定しました。The language designers enumerated several goals for the feature that eventually became delegates.

設計チームが目指したのは、あらゆる遅延バインディング アルゴリズムに適用できる共通の言語概念です。The team wanted a common language construct that could be used for any late binding algorithms. デリゲートによって、開発者が 1 つの概念を身に付け、ソフトウェアに関するさまざまな課題にその知識を応用できるような言語の実現を目標に掲げたのです。Delegates enable developers to learn one concept, and use that same concept across many different software problems.

次に設計チームが目指したのは、シングルキャストとマルチキャストの両方のメソッド呼び出しをサポートすることでした。Second, the team wanted to support both single and multicast method calls. (マルチキャスト デリゲートは、複数のメソッド呼び出しを連結するデリゲートです。(Multicast delegates are delegates that chain together multiple method calls. このシリーズの後の記事で例を見ます。)You'll see examples later in this series.)

設計チームは、C# のあらゆるコード要素に関して開発者たちが当然と考えるレベルのタイプ セーフティをデリゲートにおいても実現したいと考えていたのです。The team wanted delegates to support the same type safety that developers expect from all C# constructs.

また、設計チームは、デリゲートを初めとする遅延バインディング アルゴリズムの利便性が大いに発揮される具体的なパターンは、イベント パターンであると認識していました。Finally, the team recognized an event pattern is one specific pattern where delegates, or any late binding algorithm, is very useful. .NET のイベントの基本的なパターンをデリゲートのコードで確実に実現したいと考えていたのです。The team wanted to ensure the code for delegates could provide the basis for the .NET event pattern.

そうした目標に向けたすべての作業の成果として C# と .NET にサポートされたのが、デリゲートとイベントです。The result of all that work was the delegate and event support in C# and .NET. 以降このセクションの記事では、言語の機能やライブラリのサポート、デリゲートを扱う際に用いられる一般的な用語について取り上げています。The remaining articles in this section will cover language features, library support, and common idioms used when you work with delegates.

delegate キーワードとそれによって生成されるコード、You'll learn about the delegate keyword and what code it generates. System.Delegate クラスの機能とその使い方、You'll learn about the features in the System.Delegate class, and how those features are used. タイプ セーフなデリゲートの作成方法、デリゲート経由で呼び出すことのできるメソッドの作成方法のほか、You'll learn how to create type safe delegates, and how to create methods that can be invoked through delegates. ラムダ式を使ったデリゲートやイベントの扱い方、You'll also learn how to work with delegates and events by using Lambda expressions. LINQ の構成要素としてデリゲートがどこで使われているか、You'll see where delegates become one of the building blocks for LINQ. .NET のイベント パターンの基礎としてデリゲートがどのように使われ、両者がどのように違うのかについても説明します。You'll learn how delegates are the basis for the .NET event pattern, and how they're different.

では、始めましょう。Let's get started.