これら3つの最も重要なデリゲートについて、誰かが(うまくいけば例を挙げて)良い説明を提供できますか:
- 述語
- アクション
- 機能
Predicate
: 本質的にFunc<T, bool>
; 「指定された引数は、デリゲートによって表される条件を満たしていますか?」という質問をします。List.FindAll などで使用されます。
Action
: 引数を指定してアクションを実行します。非常に汎用的です。基本的に、副作用を意味するため、LINQ ではあまり使用されません。
Func
: LINQ で広く使用されます。通常は、複雑な構造を 1 つのプロパティに射影するなどして、引数を変換します。
その他の重要な代表者:
EventHandler
/ EventHandler<T>
: WinForms 全体で使用
Comparison<T>
: 同様IComparer<T>
ですが、デリゲート形式です。
Action
、Func
およびPredicate
すべてデリゲート ファミリーに属します。
Action
: アクションは n 個の入力パラメーターを受け取ることができますが、void を返します。
Func
: Func は n 個の入力パラメーターを受け取ることができますが、常に指定された型の結果を返します。Func<T1,T2,T3,TResult>
ここで、T1、T2、T3 は入力パラメーターであり、TResult はその出力です。
Predicate
: Predicate も Func の形式ですが、常に bool を返します。簡単に言えば、のラッパーですFunc<T,bool>
。
ジョンの答えに加えて、
Converter<TInput, TOutput>
: 本質的Func<TInput, TOutput>
には ですが、セマンティクスがあります。List.ConvertAll と Array.ConvertAll で使用されますが、個人的には他では見たことがありません。MethodInvokerは、WinForms開発者が使用できるものです。引数を受け入れず、結果を返しません。これはActionよりも前のものであり、BeginInvoke()などが型指定されていないDelegateを受け入れるため、UIスレッドを呼び出すときに引き続きよく使用されます。アクションも同様に機能しますが。
myForm.BeginInvoke((MethodInvoker)delegate
{
MessageBox.Show("Hello, world...");
});
また、ThreadStartとParameterizedThreadStartについても知っています。繰り返しますが、ほとんどの人は最近アクションを代用します。
Predicate、Func、および Action は、.NET の組み込みデリゲート インスタンスです。これらのデリゲート インスタンスはそれぞれ、特定のシグネチャを持つユーザー メソッドを参照またはポイントできます。
アクション デリゲート - アクション デリゲート インスタンスは、引数を取り、void を返すメソッドを指すことができます。
Func デリゲート - Func デリゲート インスタンスは、可変数の引数を取り、何らかの型を返すメソッドを指すことができます。
述語 - 述語は func デリゲート インスタンスに似ており、可変数の引数を取り、bool 型を返すメソッドを指すことができます。