MSDN定義System.Predicate
this way:System.Predicate <T>:這究竟是什麼意思,或者它是用來幹什麼的?
表示定義一組標準,並且確定指定的對象是否滿足這些標準的方法。
這究竟是什麼意思,或者它通常用於什麼?因爲對我來說,它看起來像一個預定義的delegate
,其方法必須採用object
的type
T
,並返回bool
- 僅此而已。
我錯過了什麼嗎?
MSDN定義System.Predicate
this way:System.Predicate <T>:這究竟是什麼意思,或者它是用來幹什麼的?
表示定義一組標準,並且確定指定的對象是否滿足這些標準的方法。
這究竟是什麼意思,或者它通常用於什麼?因爲對我來說,它看起來像一個預定義的delegate
,其方法必須採用object
的type
T
,並返回bool
- 僅此而已。
我錯過了什麼嗎?
CLR不強制類型名稱的語義。
所以,是的,Predicate<T>
只是一個代表取T
並返回bool
,但它的目的是用於預測(預測某個條件的測試)的地方。程序員應該尊重該慣例。如果您需要一個沒有預定義語義含義的類似委託,例如,您可以使用Func<T, bool>
。
對於編譯器,Predicate<T>
或Func<T, bool>
之間沒有功能差異。但是對於另一位閱讀你的代碼的開發者來說,它提供了一個關於你的代碼應該做什麼的重要提示,只要你正確地使用它。
同樣,沒有什麼可以阻止我使用System.DayOfWeek
來存儲介於1到7之間的任意值,這實際上並不代表每週的某一天。這將是一個愚蠢的事情,但編譯器一定會讓我。您需要確保代碼有意義,編譯器無法爲您做到這一點。
我認爲這個定義在特定用法中強制使用特殊的原型,而委託可以用作任何函數,只有一個System.Predicate可以用於集合謂詞函數(我會說它就像一個C++指針函數原型)
這就是我的謂詞是,該術語是從predicate logics借來的。
然後,當然可以使其他功能,這是不嚴格的謂詞,具有相同的功能簽名。
好吧,這是有道理的。 – richard
+1鏈接到相應的數學/邏輯概念 –
你認爲它是一個預定義的委託,但它最常見的用法是在可擴展性中,在方法調用之外確定是否滿足條件。
許多人現在更喜歡使用Func<T,bool>
而不是Predicate<T>
,因爲它在框架本身中是更常見的用法。
似乎奇怪他們會_define_它那樣。我希望他們只是將它定義爲它的內容,然後說「哦,順便說一句,這是最常見的用法」。這是有點混亂。 – richard
@Richard:命名它'Predicate'試圖使接受過濾函數的方式更加明確地在代碼中返回bool。 *編輯* Sven編輯他的答案來涵蓋這個理由:) –
+1;此外,現在經常用'Func'替換 - http://stackoverflow.com/questions/665494/c-why-funct-bool-instead-of-predicatet –
@Merlyn:我想你的意思是'Func'。 –
Richard
謝謝Sven。說得通! – richard