2

Aは、ブール値を返すPredicate単なるaです。Func

Predicate<T1, T2, T3, ...,Tn> = Func<T1, T2, T3, ...,Tn, bool> 

そして、anは値を返さないAction単なるaです。Func

Action<T1, T2, T3, ...,Tn> = Func<T1, T2, T3, ...,Tn, void>

私の質問:それらを差別化する追加の特性または品質はありPredicatesますか?ActionsFuncs

4

4 に答える 4

4

述語は、ブールリターン型用のFuncの特殊な形式です。と同型Func<X, bool>です。

しかし、行動はまったく異なる獣です。「ここに何かをするものがある」と書かれています。言い換えれば、アクションは副作用を実行します。

FuncとPredicateには、(少なくとも潜在的に)参照透過性の特性があります。それらは適切な数学関数として振る舞うことができます。つまり、タイプAの要素を取り、Bを返すFunc aの場合、同じAに対して常に同じBを返す必要があります。これには、かなり深く、重要で、非常に便利なプロパティがあります。特に、非常に便利です。テストが簡単で、推論が非常に簡単で、作成も簡単です。

一方、アクションは副作用を実行する必要があります。副作用は通常、順序付けの懸念を伴い、構成が難しく、プログラムの複雑さの重大な原因になります。さらに、彼らは型システムを避け、この複雑さをボイドの背後に隠します。

アクションと関数/述語は基本的に非常に異なるものです。

于 2012-11-16T04:44:35.867 に答える
2

いいえ。何もありません。それらはすべて単なるデリゲートタイプです。唯一の違いは、いくつかのメソッドはPredicate<T>(主に古いAPI)のようなものを取り、いくつかはFunc<>/を取りAction<>ます。Func<>/アプローチの利点の1つAction<>は、署名が名前から明らかであるということです(つまり、aFunc<int,float,string>はとを取り、intfloat返しますstring)が、それだけです。また、デリゲートが同じシグニチャを持っている場合でも、直接交換することはできません(を受け取るFunc<T,bool>メソッドにインスタンスを渡すことはできませんPredicate<T>)。

于 2012-11-15T11:56:43.357 に答える
1

彼らはすべてただの代表者です。デリゲートは特別なことを宣言することはできません。事実上、メソッドのシグネチャにすぎません。

デリゲート型に特別な機能を追加することはできません-少なくともC#で宣言する場合は。(ILでできることは考えられますが、私はそれが行われるのを見たことがありません。)

于 2012-11-15T11:55:19.033 に答える
1

Action<T>と同じではありませんFunc<T, void>:前者は有効ですが、後者は無効です。void有効なジェネリック型引数ではありません。

Predicate<T>Func<T, bool>まったく同じように動作します。ただし、これらはまだ異なるタイプであるため、タイプがのパラメーターを持つ関数に直接渡すことはできません。ただし、どちらか一方を一貫して使用している限り、違いはわかりません。Predicate<T>Func<T, bool>

于 2012-11-15T11:55:29.877 に答える