使用谓词而不是普通委托是否有价值?就下面的例子而言,我没有看到任何区别。
Predicate<int> isEven = delegate(int x) { return x % 2 == 0; };
Console.WriteLine(isEven(1) + "\r\r");
Func<int, bool> isEven2 = delegate(int x) { return x % 2 == 0; };
Console.WriteLine(isEven(1) + "\r\r");
使用谓词而不是普通委托是否有价值?就下面的例子而言,我没有看到任何区别。
Predicate<int> isEven = delegate(int x) { return x % 2 == 0; };
Console.WriteLine(isEven(1) + "\r\r");
Func<int, bool> isEven2 = delegate(int x) { return x % 2 == 0; };
Console.WriteLine(isEven(1) + "\r\r");
它们实际上是相同的。 Predicate<T>
是一个委托类型,被添加到基类库中用于列表和数组的 Find() 方法。这是在 LINQ 之前,更通用的 Func
委托系列被引入之时。你甚至可以编写自己的委托类型并使用它:
delegate bool IntPredicate(int x);
static void Main()
{
IntPredicate isEven = delegate(int x) {return x % 2 == 0;};
Console.WriteLine(isEven(1) + "\r\r");
}
Func<T,bool>
е’ҢжӣҙеҘҪзңӢзҡ„Predicate<T>
д№Ӣй—ҙзҠ№иұ«дёҚеҶігҖӮзү№еҲ«жҳҜиҖғиҷ‘еҲ°Func并没жңүиҜҙжҳҺе…¶йў„жңҹз”ЁйҖ”пјҢиҖҢPredicateеҲҷжңүзӮ№иҜҙжҳҺдәҶгҖӮ - Joshfoo(x => x % 2 == 0);
。 - Mark CidadePredicate<T>
,委托的预期用途更加明确。然而,如果您在命名参数方面做得很好,则差异可能是微不足道的。例如:public SomeObj Find(Func<SomeObj, bool> isMatch) { }
与 public SomeObj Find(Predicate<SomeObj> isMatch) { }
。 - Merlyn Morgan-Graham为了与LINQ保持一致,我倾向于定义Func<T, bool>
而不是Predicate<T>
。
Predicate是一个委托。它是在.Net框架3.0中定义的委托。Predicate始终返回布尔值。因此,您代码中的两个委托是等效的。.Net提供的其他委托包括Func和Action。Action返回void。
它们实际上是相同的。也就是说,扩展方法(在您自己的库或他人的库中)更有可能定义在 Func<T, TResult>
上,因此我更喜欢它。