开发中使用委托可以很方便的完成解耦和扩展,但是每次都需要手动创建新的委托感觉还是有些麻烦,这时我们可以考虑C#中的预定义委托类型。
Func<>:最多支持16个泛型参数,约定最后一个类型为返回值类型。
Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,TResult>
//2个参数,一个返回值
Func<int, int, int> int1 = GetInt;
//1个参数,一个返回值
Func<int, int> int2 = GetInt1;
//匿名函数(lambda)计算
Func<int, int, string> str1 = (a, b) => (a * b).ToString();
Func<string, int, string> str2 = (a, b) =>
{
string result = (int.Parse(a) / b).ToString();
return result;
};
Action<>:最多支持16个泛型参数,无返回值。
Action<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16>
//2个参数,无返回值
Action<int, int> int3 = PrintInt;
Action printstr = () =>
{
Console.WriteLine(str1(3, 4));
Console.WriteLine(str2(str1(3, 4), 4));
};
Predicate<>:只支持一个泛型参数,固定返回bool类型。
Predicate<T>
//判断单个参数是否满足条件
Predicate<int> predicate = a => a > int1(1, 2);
以上3种预定义委托类型足以满足大部分应用场景,省掉了自己创建委托的时间。
参考代码:
class FuncAndActionDemo
{
public static void DemoMain()
{
//2个参数,一个返回值
Func<int, int, int> int1 = GetInt;
//1个参数,一个返回值
Func<int, int> int2 = GetInt1;
//2个参数,无返回值
Action<int, int> int3 = PrintInt;
//输出结果
int3(int1(1, 2), int2(3));
//匿名函数(lambda)计算
Func<int, int, string> str1 = (a, b) => (a * b).ToString();
Func<string, int, string> str2 = (a, b) =>
{
string result = (int.Parse(a) / b).ToString();
return result;
};
//判断单个参数是否满足条件
Predicate<int> predicate = a => a > int1(1, 2);
Action printstr = () =>
{
Console.WriteLine(str1(3, 4));
Console.WriteLine(str2(str1(3, 4), 4));
};
//执行输出命令
printstr();
}
/// <summary>
/// 两数相加
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
static int GetInt(int a, int b)
{
return a + b;
}
/// <summary>
/// 参数乘2
/// </summary>
/// <param name="a"></param>
/// <returns></returns>
static int GetInt1(int a)
{
return a * 2;
}
/// <summary>
/// 输出两数相乘结果
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
static void PrintInt(int a, int b)
{
Console.WriteLine(a * b);
}
}
输出结果: