Func<>
是一个通用委托 - 使用起来非常方便,因为您不必为每个参数/返回类型组合创建自己的委托。
早些时候,您必须编写如下内容:
public delegate long MyDelegate( int number );
public void Method( IEnumerable<int> list, MyDelegate myDelegate )
{
foreach( var number in list )
{
myDelegate( number );
}
}
您必须发布您的委托,以便用户可以正确调用您的方法。特别是当您需要一堆不同的委托时,您最终会为每个参数列表和返回类型发布一个委托。
With Func<>
你只需写:
public void Method( IEnumerable<int> list, Func<int, long> myDelegate )
{
foreach( var number in list )
{
myDelegate( number );
}
}
它的含义与第一个代码示例相同 -Func<int, long>
定义一个委托,它接受一个整数参数并返回一个长整型值。
当然,您也可以使用更长的参数列表:Func<int, int, bool, long>
仍然会返回一个long值,而需要两个ints and a bool价值。如果您希望委托没有返回值,则必须使用Action<>
,这将有void作为返回类型。
EDIT(按要求):如何调用我的示例中的方法:
对于调用者来说,解决方案与MyDelegate
or 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;
}