委托中的Action和Func,是编程软件定义好的委托,所以不需要自定义可直接使用
现在先看Action
//Action委托引用了一个void返回类型的方法,T表示方法参数,先看Action委托有哪些,不能用于有返回值的方法
//Action
//Action <in T >//T为泛型,指的是方法里的参数类型
//Action <in T1,in T2 >
//Action <in T1,in T2....inT16 >//最多可以放入16个泛型
例子如下
class Program
{
static void PrintString()//定义一个没有返回值和参数的方法
{
Console.WriteLine("hello world");
}
static void Printint(int i)//定义一个没有返回值有参数的方法
{
Console.WriteLine(i);
}
static void PrintString(string str)
{
Console.WriteLine(str);
}
static void Printdoubleint(int i, int j)
{
Console.WriteLine(i+j);
}
static void Main(string[] args)
Action a = PrintString;//action是系统预定义的委托类型,可以指向一个没有返回值没有参数的方法
Action<int> a;//定义了一个委托类型,指向一个没有返回值,有一个int参数的方法,<>里是泛型,可自定义
a = Printint;
Action<string> b = PrintString;
//定义了一个委托类型,指向一个没有返回值,有一个string参数的方法,<>里是泛型,可自定义,
//系统会自动寻找匹配方法
Action<int, int> a=Printdoubleint;
a(34, 23);
Console.ReadKey();
//action可以后面通过泛型去指定action指向的方法的多个参数的类型,参数类型跟action后的类型相对应
}
}
在上面的例子中,
如果一个方法没有返回值和参数,直接Action一个对象a就可以进行方法的指向
如果一个方法没有返回值但有参数,需要以Action +委托对象名的形式进行委托,且泛型T要与方法的参数类型相同
如果是一个方法的重载,Action可以后面通过泛型去指定action指向的方法的多个参数的类型,参数类型跟Action后的类型相对应
接下来是Func
//Func引用了一个带有一个返回值的方法,它可以传递0或者多到16个参数类型,和一个返回类型,只能用于有返回值的方法
//Func <out TResult >//out Tresults是返回值类型
// Func <in T,out TResult >//
//Func < int T1,inT2,,,,,,in T16,out TResult >
例子如下
class Program
{
static int Test1()
{
return 1;
}
static int Test2(string str)
{
Console.WriteLine(str);
return 100;
}
static void Main(string[] args)
{
Func<int> a=Test1;
Console.WriteLine(a());
Func<string, int> b=Test2;
//func后面可以跟很多类型,最后一个类型是返回值类型,前面的都是参数类型,位置要对应
Console.WriteLine(b("sdfsdfsdfsdfsd"));
Console.ReadKey();
}
}
在上面的例子中,func后面可以跟很多类型,最后一个类型是返回值类型,前面的都是参数类型,位置要对应
Action和Func的重要区别:
Action只用于没有返回值的方法,Func只用于有返回值的方法
它们泛型里的区别:
Action的泛型里要和方法参数的类型相同,且只有一种泛型
Func的泛型里前者和方法参数类型相同,最后一个与返回值类型相同