2011-07-20 19 views
4

MSDNは、System.Predicatethis wayを定義:System.Predicate <T>:これは実際には何を意味するのでしょうか?

基準のセットを定義し、指定されたオブジェクトがこれらの基準を満たしているか否かを判断する方法を表します。

これは実際にはそれが意味するのか、それとも一般的に使用されているのでしょうか?私にとっては、あらかじめ定義されたdelegateのように見え、方法はobjecttypeTになり、返されるのはboolです。

何か不足していますか?

答えて

10

CLRは型名のセマンティクスを強制しません。

したがって、Predicate<T>Tを返してboolを返すだけのデリゲートですが、述語(特定の条件のテスト)が必要な場所で使用されることを前提としています。その慣習を尊重することはプログラマの責任です。あらかじめ定義された意味の意味を持たない同様のデリゲートが必要な場合は、たとえばFunc<T, bool>を使用できます。

コンパイラには、Predicate<T>またはFunc<T, bool>の間に機能的な違いはありません。しかし、あなたのコードを読んでいる別の開発者には、コードを正しく使用すれば、コードが何をすべきかという重要なヒントが得られます。

同様に、System.DayOfWeekを使用して実際に曜日を表さない1〜7の任意の値を格納するのを止めることはできません。それは愚かなことですが、コンパイラは確かに私をさせるでしょう。あなたのコードが意味をなさないことを確認するのはあなた次第です。コンパイラはあなたのためにそれを行うことはできません。

+0

+1;また、今ではしばしば 'Func 'に置き換えられます - http://stackoverflow.com/questions/665494/c-why-funct-bool-instead-of-predicatet –

+2

@Merlyn:あなたは 'Func 'を意味すると思います。 – Richard

+0

ありがとうSven。意味をなさない! – richard

0

私はデリゲートを任意の関数として使うことができる一方で、特定の使用法では特別なプロトタイプを強制すると思いますが、System.Predicateのみをコレクション述語関数に使用できます(C++ポインタ関数プロトタイプ)

3

つまり、述語は、predicate logicsから借りています。

もちろん、厳密には述語ではなく、同じ関数シグネチャを持つ他の関数を作成することは可能です。

+0

それは意味があります。 – richard

+0

+1は対応する数学/論理概念へのリンクのため –

1

あなたは定義済みのデリゲートだと思っていますが、最も一般的な使い方は、条件が満たされたかどうかをメソッド呼び出しの外側で判断する拡張性です。

多くの場合、Predicate<T>ではなくFunc<T,bool>を使用する方が好きです。これはフレームワーク自体の中でより一般的な使用法であるためです。

+0

それはそれがそのように定義するのが奇妙であると思われます。私は彼らがそれが何であるかを定義し、「ああ、ところで、これが最も一般的な使い方です」と言いたいと思います。それは少し混乱している。 – richard

+1

@Richard:名前を付ける「述語」は、コード内でboolをより明示的に返すフィルタリング関数を受け入れるというイディオムを作る試みです。 *編集* Svenはこの根拠をカバーするために彼の答えを編集:) –

関連する問題