C# Func<;TObject,bool>;或谓词<;TObject>;?
我一次又一次地看到API(特别是在.NET框架中)使用C# Func<;TObject,bool>;或谓词<;TObject>;?,c#,linq,delegates,lambda,C#,Linq,Delegates,Lambda,我一次又一次地看到API(特别是在.NET框架中)使用Func,而Predicate似乎是一个完全负责任的选项。API设计人员这样做有什么好的理由?与LINQ的其他部分保持一致 (已经注意到了“异常”,但是对于匿名委托和lambda函数,它没有什么区别,因此几乎不需要注意这种区别。)Func委托是指定lambda/delegate到方法的“新”方式。但是,只有一组方便的委托,如果有一个更具体的委托做同样的事情,那么就这样做 在您的示例中,我总是选择谓词,因为它更具有自文档性(假设谓词是您想要的)
Func
,而Predicate
似乎是一个完全负责任的选项。API设计人员这样做有什么好的理由?与LINQ的其他部分保持一致
(已经注意到了“异常”,但是对于匿名委托和lambda函数,它没有什么区别,因此几乎不需要注意这种区别。)Func委托是指定lambda/delegate到方法的“新”方式。但是,只有一组方便的委托,如果有一个更具体的委托做同样的事情,那么就这样做
在您的示例中,我总是选择谓词,因为它更具有自文档性(假设谓词是您想要的)在LINQ中,Func
用于Where
,以便采用索引和元素的其他重载是一致的:
IEnumerable<T> Where(IEnumerable<T> source, Func<T, bool> predicate)
IEnumerable<T> Where(IEnumerable<T> source, Func<T, int, bool> predicate)
IEnumerable其中(IEnumerable源,Func谓词)
IEnumerable其中(IEnumerable源,Func谓词)
我个人认为,
谓词的名称
更具描述性,因此我会在不存在上述一致性问题的情况下使用它。请注意,只需要了解操作
和函数
委托类型就可以了。我也不认为与LINQ其余部分的“一致性”是一个很好的理由。关于一种可能性,请参见Jon的答案。是的,我担心答案不会比这更好。这就像某种代码官僚机构赢得了纯洁的一面。(即,尽管存在一致性,仍应始终使用谓词)。