114

誰かがこれら3人の最も重要な代表の良い説明を(できれば例を使って)提供できますか:

  • 述語
  • アクション
  • 機能

C#開発者は他にどのようなデリゲートを知っておくべきですか?

実稼働コードでどのくらいの頻度でそれらを使用しますか?

8 답변


167

  • Predicate:本質的にFunc<T, bool>; 「指定された引数はデリゲートによって表される条件を満たすか」という質問をするList.FindAllのようなもので使用されます。

  • Action処置:引数を指定してアクションを実行してください。非常に一般的な目的基本的に副作用を意味するのでLINQではあまり使われていません。

  • Func: 中古広範囲にLINQでは、通常、引数を変換します。複雑な構造を1つの特性に射影することによって。

その他の重要な代表者

  • EventHandler/EventHandler<T>:WinFormsの至るところで使われる

  • Comparison<T>:好きIComparer<T>デリゲート形式です。


  • もありますSystem.Converter<TInput, TOutput>めったに使用されませんが。 - G-Wiz
  • 多くのモデルをビジネスクラスに変換する必要がある場合、Converterは優れたデリゲートです。stum.de/2009/12/23/… - Michael Stum
  • EventHandler/EventHandler<T>WinFormの外にも現れます。 - Andy
  • @アンディ:やや…でも、たとえばWPFではそうではありません。 WinForms固有のものは何もないことに同意します。 - Jon Skeet

27

ActionFuncそしてPredicateすべてが代議員の家族に属しています。

Action処置:アクションはn個の入力パラメーターを取ることができますが、voidを戻します。

Func:Funcはn個の入力パラメータを取ることができますが、与えられた型の結果を常に返します。Func<T1,T2,T3,TResult>ここで、T1、T2、T3は入力パラメータで、TResultはその出力です。

Predicate:述語もFuncの一種ですが、常にboolを返します。簡単に言うとラッパーですFunc<T,bool>


9

Jonの答えに加えて、

  • Converter<TInput, TOutput>:それは本質的にFunc<TInput, TOutput>しかし、意味論があります。 List.ConvertAllおよびArray.ConvertAllによって使用されますが、個人的には他の場所で見たことはありません。


4

MethodInvokerはWinForms開発者が使用できるものです。引数を受け取らず、結果も返しません。これはActionよりも前のもので、BeginInvoke()などは型指定のないDelegateを受け付けるので、UIスレッドを呼び出すときにはまだよく使われます。アクションも同様にしますが。

myForm.BeginInvoke((MethodInvoker)delegate
{
  MessageBox.Show("Hello, world...");
});

ThreadStartとParameterizedThreadStartにも気をつけてください。最近でも、ほとんどの人がアクションを代用します。


3

Predicate、Func、およびActionは、.NETの組み込みのデリゲートインスタンスです。これらの各デリゲートインスタンスは、特定のシグネチャを持つユーザーメソッドを参照または指す可能性があります。

アクションデリゲート - アクションデリゲートインスタンスは引数を取り、voidを返すメソッドを指すことができます。

Funcデリゲート - Funcデリゲートインスタンスは、可変数の引数を取り、何らかの型を返すメソッドを指すことができます。

述語 - 述語はfuncデリゲートインスタンスに似ていて、可変数の引数を取り、ブール型を返すメソッドを指すことができます。


3

他の人たちはすでに特定のデリゲートの正しい使い方について述べていますが、私は彼らの答えを完成させる何かを加えたいと思います。 Func、Action、Predicateという名前には数学的な背景があります。物事を単純にするために、私はこのような数学関数の非公式の定義をします。

関数は集合間の関係です。 1つの集合のメンバーを取り、それを入力として使用します。関数はこの入力を他の集合の1つのメンバーにのみマップします。言い換えれば、何かが入力を取得して出力を生成します。

やはり、非公式にも、数学的述語はその変数に応じて真か偽かを表すステートメントです。他の人がブール値を返す関数を述べたように。

そして最後に、Actionは無効な関数です(あるいはより数学的に正しい名前無効メソッドまたはプロシージャ)


2

ラムダによるアクションと機能:

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();


0

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

リンクされた質問


関連する質問

最近の質問