委託コンセプト著者:Liang Binyu 近日公開予定の「C# 初心者教室」より抜粋
[email protected]
http://www.cnblogs.com/BeginnerClassroom
関数を別の関数のパラメーターとして使用する必要がある場合は、デリゲート メカニズムを使用する必要があります。委任は明確に説明するのが難しい概念です。著者は数日間真剣に考え、最終的に独創的な例を思いつきました。
次に、サーカスのパフォーマンス関数 RunCircus() を設計します。その最初のパラメーターは、どの動物が渡されても、その動物のパフォーマンスが実行される関数です。 「Delegate」という名前の新しいプロジェクトを作成し、次のコードを追加してください。
試してみましょう: デリゲートの定義
//「C#初心者教室」
//関数: ドッグショー
static void DogAct(文字列名)
{
Console.WriteLine("こんにちは、私は " + 名前 + "!");
Console.WriteLine(@"
.----。
_.´_`。
.--(#)(##)---/#
.' @ /###
: 、#####
`-..__.-' _.-###/
`;_: `''
.''''''''''。
/、スヌーピー、
// いいね! \
「-._______.-」
___。
(______|______)");
}
//関数: キャットショー
static void CatAct(文字列名)
{
Console.WriteLine("こんにちは、私は " + 名前 + "!");
Console.WriteLine(@"
.-.___.-.
| ` / |
/ '.()--
| '._/
_| O _ O |_
= '-' /=
「-._____.-」
/`/__/`
//おお/
(_| |_)
|____、____|
(____|____)");
}
//関数: ライオンショー
static void LionAct(文字列名)
{
Console.WriteLine("こんにちは、私は " + 名前 + "!");
Console.WriteLine(@"
、%%%%%%%%、
、%%/%%%%/%%
、%%%c "" J/%%%
%. %%%%/ o o %%%
`%%% _ |%%%
`%% `%%%%(__Y__)%%'
// ;%%%%`-/%%%'
(( / `%%%%%%%'
\ 。
\ / |
\/ ) |
/_ |__
(____________)))))))");
}
//デリゲートを定義する
デリゲート void AnimalAct(文字列名);
//関数: サーカスのパフォーマンス (最初のパラメータは AnimalAct 型デリゲート)
static void RunCircus(AnimalAct AnimalAct, 文字列名)
{
動物行為(名前);
}
static void Main(string[] args)
{
//関数 DogAct() を AnimalAct 型デリゲートに変換します
AnimalAct deleDogAct = new AnimalAct(DogAct);
//デリゲート deleDogAct を関数 RunCircus() に渡します
RunCircus(deleDogAct, "スヌーピー");
//関数 CatAct() を AnimalAct 型デリゲートに変換し、関数 RunCircus() に渡します。
RunCircus(new AnimalAct(CatAct), " Kitty ");
}
実行結果は次のとおりです。
「C#初級クラス」
関数 RunCircus(AnimalAct AnimalAct, string name) の最初のパラメータは、実際には動物を表す関数であり、どの種類の関数が渡されると、どの種類の動物が実行されます。ただし、厳密な型チェックを実行するには、関数の名前を直接関数に渡すことはできず、最初にデリゲート (Dlelegate)、つまり「関数の型」を定義する必要があります。
デリゲートはキーワード delegate で宣言されています。上記のステートメントは、AnimalAct というデリゲート (関数の型) を定義しており、デリゲートのパラメーターの型と戻り値の型を明確に指定しています。関数をパラメーターとして使用する必要がある場合は、まず関数をデリゲート インスタンスに変換する必要があります。
このデリゲート インスタンスは、それを呼び出す関数にパラメーターとして渡されます。
デリゲート インスタンス deleDogAct が実際には関数 DogAct() のエイリアスであることがわかります。デリゲートとデリゲートされた関数は同じパラメーターの型と戻り値の型を持つ必要があります。
私たちのプログラムでは、サーカスは常に関数 RunCircus() を呼び出して実行します。 RunCircus() 関数を定義する場合、関数に渡されたデリゲートがどの関数を表すかはわかりません。この関数は、RunCircus() 関数が呼び出され、実際のパラメータが渡されるまで実現されません。実際のパラメータがどのようなものであっても、deleDogAct デリゲーションを渡すと、サーカスは犬のパフォーマンスを実行し、deleCatAct デリゲーションを渡すと、サーカスは猫のパフォーマンスを実行します。 deleLionActの代表団、サーカスは猫のパフォーマンスを行います サーカスはライオンのショーを行いました。したがって、デリゲートをパラメーターとして受け取る関数には、一定の一般性があります。