誰かがこれら3人の最も重要な代表の良い説明を(できれば例を使って)提供できますか:
C#開発者は他にどのようなデリゲートを知っておくべきですか?
実稼働コードでどのくらいの頻度でそれらを使用しますか?
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
:述語もFuncの一種ですが、常にboolを返します。簡単に言うとラッパーですFunc<T,bool>
。
Jonの答えに加えて、
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デリゲートインスタンスに似ていて、可変数の引数を取り、ブール型を返すメソッドを指すことができます。
他の人たちはすでに特定のデリゲートの正しい使い方について述べていますが、私は彼らの答えを完成させる何かを加えたいと思います。 Func、Action、Predicateという名前には数学的な背景があります。物事を単純にするために、私はこのような数学関数の非公式の定義をします。
関数は集合間の関係です。 1つの集合のメンバーを取り、それを入力として使用します。関数はこの入力を他の集合の1つのメンバーにのみマップします。言い換えれば、何かが入力を取得して出力を生成します。
やはり、非公式にも、数学的述語はその変数に応じて真か偽かを表すステートメントです。他の人がブール値を返す関数を述べたように。
そして最後に、Actionは無効な関数です(あるいはより数学的に正しい名前無効メソッドまたはプロシージャ)
ラムダによるアクションと機能:
person p = new person();
Action<int, int> mydel = p.add; /*(int a, int b) => { Console.WriteLine(a + b); };*/
Func<string, string> mydel1 = p.conc; /*(string s) => { return "hello" + s; };*/
mydel(2, 3);
string s1= mydel1(" Akhil");
Console.WriteLine(s1);
Console.ReadLine();
FuncはよりLINQにやさしく、パラメータとして渡すことができます。 (ポイントフリー)
述語はできません、もう一度ラップする必要があります。
Predicate<int> IsPositivePred = i => i > 0;
Func<int,bool> IsPositiveFunc = i => i > 0;
new []{2,-4}.Where(i=>IsPositivePred(i)); //Wrap again
new []{2,-4}.Where(IsPositivePred); //Compile Error
new []{2,-4}.Where(IsPositiveFunc); //Func as Parameter
System.Converter<TInput, TOutput>
めったに使用されませんが。 - G-WizEventHandler/EventHandler<T>
WinFormの外にも現れます。 - Andy