我是C#的初学者,只是一个关于C#中的谓词和Func委托之间的区别的问题
我们知道:
public delegate bool Predicate<in T>(T obj);
public delegate TResult Func<in T, out TResult>(T arg);
所以,如果我喜欢
Func<Product, bool> firstdelegate = ...
和
Predicate<Product> secondpredicate = ...
他们不是一样吗?我是说它们都做同样的事情,所以为什么在LINQ的Where()方法中使用Func类型委托而不是谓词呢?
答案 0 :(得分:4)
Predicate<T>
是在.NET 2.0中引入的,并引入了泛型。这是一个接受一个参数并返回bool
的委托。
但是,随着.NET 3.5中LINQ的引入,确定了对两个通用类型的家族的需求-Func
和Action
(区别在于是否它们返回任何内容),最多占用 16 4 1 个通用输入参数,并且在它们的返回类型中是通用的。如果Func
首先存在,那么Predicate<T>
永远不会被创建。这是不必要的专门委托类型。
但是出于向后兼容的原因,它们现在无法从框架中删除 Predicate<T>
。 有些可能会争辩说它的名称确实传达了特定的语义,但是我很难确定许多情况,其中任何Func<T,bool>
(或Func<T1,T2,bool>
等)都不会被认为是谓词。
1 4,在.NET 4及更高版本中为16。