Func<> 是一个通用委托 - 它使用起来非常方便,因为您不必为每个参数/返回类型组合创建自己的委托。
之前,您必须编写如下内容:
public delegate long MyDelegate( int number );
public void Method( IEnumerable<int> list, MyDelegate myDelegate )
{
foreach( var number in list )
{
myDelegate( number );
}
}
您必须发布您的委托,以便用户可以正确调用您的方法。尤其是当您需要一堆不同的委托时,您最终会为每个参数列表和返回类型发布一个。
使用Func<>,您只需写:
public void Method( IEnumerable<int> list, Func<int, long> myDelegate )
{
foreach( var number in list )
{
myDelegate( number );
}
}
这与第一个代码示例的含义相同 - Func<int, long> 定义了一个接受一个整数参数并返回一个 long 值的委托。
当然你也可以使用更长的参数列表:Func<int, int, bool, long> 仍然会返回一个 long 值,而它需要两个 ints 和一个 bool em> 值。如果你想要一个没有返回值的委托,你必须使用Action<>,它的返回类型是void。
编辑(按要求):如何在我的示例中调用方法:
对于调用者来说,MyDelegate 或Func<> 的解决方案没有区别。在这两种情况下,他都有三个选项来调用该方法:
使用 lambda 表示法(需要 C# 3.0,可能是短方法的最佳解决方案):
Method( myList, i => i * i );
通过使用匿名方法(需要 C# 2.0):
Method( myList, delegate( int i )
{
return i * i;
} );
或者使用真实的方法作为参数:
Method( myList, Square );
private static long Square( int number )
{
return number * number;
}