MSDN定义System.Predicate
this way:
表示定义一组条件并确定指定对象是否符合这些条件的方法。
这真的意味着什么,或者它通常用于什么?因为对我而言,它看起来像预定义的delegate
,其方法必须object
type
T
并返回bool
- 仅此而已。
我错过了什么吗?
答案 0 :(得分:10)
CLR不强制使用类型名称的语义。
所以是的,Predicate<T>
只是一个委托T
并返回bool
,但它意味着用于谓词(某个条件的测试)的地方是期待。程序员应该尊重该惯例。如果您需要一个没有预定义语义含义的类似委托,您可以使用Func<T, bool>
,例如。
对于编译器,Predicate<T>
或Func<T, bool>
之间没有功能差异。但是对于另一个阅读代码的开发人员来说,只要您正确使用它,它就会提供一个关于代码应该做什么的重要提示。
同样,没有什么可以阻止我使用System.DayOfWeek
存储1到7之间的任意值,而这个值实际上并不代表一周中的某一天。这将是一个愚蠢的事情,但编译器肯定会让我。由您来确保您的代码有意义,编译器不能为您做到这一点。
答案 1 :(得分:3)
这就是我谓词,这个词来自predicate logics。
然后,当然可以使其他函数(不是严格谓词)具有相同的函数签名。
答案 2 :(得分:1)
您认为它是一个预定义的委托,但最常见的用法是在可扩展性方面确定方法调用之外是否满足条件。
现在很多人更喜欢使用Func<T,bool>
而不是Predicate<T>
,因为它在框架内更常用。
答案 3 :(得分:0)
我认为定义在特定用法中强制使用特殊原型,而委托可以用作任何函数,只有System.Predicate可以用于集合谓词函数(我会说它就像一个C ++指针函数原型)