C# 泛型委托
虽然没有必要,但是还是先看看自定义的泛型委托:
namespace _20200402 { class Program { static void Main(string[] args) { MyDele<int> myDele1 = new MyDele<int>(Add); //实例化委托,此时为返回值为int,含有两个int参数的委托,委托传入的是Add方法 int resu = myDele1(20, 30); //通过委托调用方法 Console.WriteLine(resu); //输出结果 MyDele<double> myDele2 = new MyDele<double>(Muti); //实例化委托,此时为返回值为double,含有两个double参数的委托,委托传入的是Muti方法 double resu2 = myDele2(2.02, 3.03); //通过委托调用方法 Console.WriteLine(resu2); //输出结果 } static double Muti(double x, double b) //含有两个double类型的参数,返回值为double的静态方法 { return x * b; } static int Add(int x, int y) //含有两个int类型的参数,返回值为int类型的静态方法 { return x + y; } delegate T MyDele<T>(T x, T y); //声明泛型委托,T为泛化的类型,随着使用的不同而不同 } }
当然,.NET 框架为我们封装了泛型委托类,因此大部分情况下我们不必再声明委托,可以拿来直接实例化使用,常用的是Func<T>委托、Action<T>委托
Action<>委托具有16个重载,它具有参数传入,但不返回值,不同的重载是传入参数个数不一样,传入的参数不必是同一类型,可以为不同类型。
Func<>委托有17个重载,<>之内至少有一个参数,只有一个的话,代表返回值类型;若和下图相似,则最后一个为返回值类型,其余的均为传入的参数类型。
namespace _20200402_2 { class Program { static void Main(string[] args) { Action action1 = new Action(M1); //无参数的Action委托,传入的方法为M1 action1(); Action<int> action2 = new Action<int>(M2); //传入参数为int类型的Action委托,传入的方法为M2 action2(3); Action<int, string> action3 = new Action<int, string>(M3); //传入参数为int和string类型的委托,传入的方法为M3 action3(3, "Hello"); } static void M1() { Console.WriteLine("Hello world!"); } static void M2(int x) { Console.WriteLine($"{x} * {x} = {x * x}"); } static void M3(int x,string str) { for (int i = 0; i < x; i++) { Console.WriteLine(str); } } } }
namespace _20200402_3 { class Program { static void Main(string[] args) { Func<int, int, int> func = new Func<int, int, int>(Add); //前两个int表示传入参数的类型,最后int表示返回值的类型,传入的方法是Add方法 int resu = func(2, 8); Console.WriteLine(resu); } static int Add(int x, int y) { return x + y; } } }