2011-07-20 28 views

回答

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

你認爲它是一個預定義的委託,但它最常見的用法是在可擴展性中,在方法調用之外確定是否滿足條件。

許多人現在更喜歡使用Func<T,bool>而不是Predicate<T>,因爲它在框架本身中是更常見的用法。

+0

似乎奇怪他們會_define_它那樣。我希望他們只是將它定義爲它的內容,然後說「哦,順便說一句,這是最常見的用法」。這是有點混亂。 – richard

+1

@Richard:命名它'Predicate'試圖使接受過濾函數的方式更加明確地在代碼中返回bool。 *編輯* Sven編輯他的答案來涵蓋這個理由:) –

相關問題