C#中谓词和Func委托之间的区别

时间:2019-03-08 06:54:31

标签: c# .net delegates

我是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类型委托而不是谓词呢?

1 个答案:

答案 0 :(得分:4)

Predicate<T>是在.NET 2.0中引入的,并引入了泛型。这是一个接受一个参数并返回bool的委托。

但是,随着.NET 3.5中LINQ的引入,确定了对两个通用类型的家族的需求-FuncAction(区别在于是否它们返回任何内容),最多占用 16 4 1 个通用输入参数,并且在它们的返回类型中是通用的。如果Func首先存在,那么Predicate<T>永远不会被创建。这是不必要的专门委托类型。

但是出于向后兼容的原因,它们现在无法从框架中删除 Predicate<T>有些可能会争辩说它的名称确实传达了特定的语义,但是我很难确定许多情况,其中任何Func<T,bool>(或Func<T1,T2,bool>等)都不会被认为是谓词。


在.NET 3.5中

1 4,在.NET 4及更高版本中为16。