【问题标题】:differences between Predicate and Func delegate in C# [duplicate]C# 中 Predicate 和 Func 委托之间的区别 [重复]
【发布时间】:2019-03-08 06:54:30
【问题描述】:

我是 C# 的初学者,只是一个关于 C# 中 Predicate 和 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 类型委托而不是 Predicate?

【问题讨论】:

  • 如果 LINQ 在 Where 中使用 Predicate 会很奇怪,但在其他任何地方使用 Func,包括 Where 的其他重载。
  • class Point1 { int x,y; }class Point2 { int x,y; } 一样吗?绝对不是,但是是的,它们有相似之处。但是需要 Point1 的方法永远不会接受 Point2 实例作为参数。签名不兼容。

标签: c# .net delegates


【解决方案1】:

Predicate&lt;T&gt; 在 .NET 2.0 中引入泛型。它是一个接受一个参数并返回一个bool 的委托。

但是,随着 .NET 3.5 中 LINQ 的引入,确定了对两个泛型类型家族的需求 - FuncAction(区别在于它们是否返回任何内容)最多可占用 16 41 个通用输入参数,并在其返回类型中是通用的。如果Func 首先存在,Predicate&lt;T&gt; 就永远不会被创建。这是一种不必要的特殊委托类型。

但出于向后兼容性的原因,它们现在无法从框架中删除 Predicate&lt;T&gt;有些人可能会争辩说它的名字确实传达了特定的语义含义,但我很难确定任何Func&lt;T,bool&gt;(或Func&lt;T1,T2,bool&gt;等)都不会被视为谓词的情况。


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

【讨论】:

  • AFAIK,.NET 3.5 只引入了最多 4 个参数的变体。
  • @PetSerAl - 更正和脚注。
猜你喜欢
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-12
  • 2013-10-20
  • 1970-01-01
相关资源
最近更新 更多