泛型委托配合lambda用到极致的例子。
有这样一个方法:
static void DoSomeCalc<T>(Func<T, T, T>func, T x, T y)
{
T res = func(x, y);
Console.WriteLine(res);
}
先来分析一下这个函数:
-
函数返回值为void空。DoSomeCalc函数名称后面接了一个<T>泛型标识符。<T>标识待特化的类型。
-
整个DoSomeCalc函数需要三个参数:
- 一个参数是Func委托类型的参数func,而且是泛型委托类型,这个Func泛型委托的参数所包裹的函数:需要输入两个待特化类型<T>类型的参数,返回一个<T>类型的返回值。
- 另外两个参数是<T>类型的x和y。
-
整个函数的函数体里面的逻辑是将后两个参数传递给传入进来的委托方法。
-
函数体的逻辑也完全满足了委托包裹函数的实现形式。两个<T>类型通过委托进来的运算输出返回一个<T>类型。
泛型委托的类型推断:使得我们在调用方法的时候可以省去对类型的声明。
上面的函数如何调用?
DoSomeCalc<int>((int a, int b) => { return a * b; }, 100, 200);
其中第一个<int>可以省略。因为泛型委托的类型推断功能。return也可以省略,可以用一个括号将函数体(lambda表示)包裹起来。实测:不用括号包裹也行。
DoSomeCalc(((int a, int b) => a * b), 100, 200);
输入结果:20000。
using System;
namespace DelegateExample
{
delegate T MyDele<T>(T a, T b);
class Program
{
static void Main(string[] args)
{
DoSomeCalc<int>((int a, int b) => a * b, 100, 200);
DoSomeCalc(((int a, int b) => a * b), 100, 200);
}
static void DoSomeCalc<T>(Func<T, T, T>func, T x, T y)
{
T res = func(x, y);
Console.WriteLine(res);
}
}
}