一、一个委托是一个指向一个方法的引用,或者说,一个委托的实例就是一个指向某个方法的对象,这是一个简单却十分强大的概念。
有参数的方法中,我们把另一个方法当作参数传进来,那么这个方法的类型就是委托类型。
委托所指向的函数必须跟委托具有相同的签名;我们可以把一个函数赋值给委托,前提是这个函数的签名必须跟委托是一样的
1.声明委托的关键词是delegate
Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型。
例:public delegate int MethodtDelegate(int x, int y);表示有两个参数,并返回int型。
class Program
{
//声明一个委托指向相同签名的2个函数SayHiChinese,SayHiEnglish
public delegate void DelSayHi(string name);
static void Main(string[] args)
{
SayHi("张三",SayHiChinese);//把函数当成参数直接传进来
Console.ReadKey();
//另一种调用方式,这种情况可以不用写SayHi函数了
DelSayHi del=SayHiChinese;
Del(“张三”);
Console.ReadKey();
//第三种方法,可以使用匿名函数,匿名函数的签名也要跟委托一样
DelSayHi del = delegate (string name){ Console.WriteLine("你好" + name); };
//第四种方法lamda表达式 => goes to
DelSayHi del = (string name) => { Console.WriteLine("你好" + name); };
del("张三");
Console.ReadKey();
}
public static void SayHi(string name, DelSayHi del)//委托类型的参数就是函数
{
del(name);
}
public static void SayHiChinese(string name)
{
Console.WriteLine("你好" + name);
}
public static void SayHiEnglish(string name)
{
Console.WriteLine("Hello" + name);
}
}
二、泛型委托
(1). Func
Func是有返回值的泛型委托
Func<int> 表示无参,返回值为int的委托
Func<object,string,int> 表示传入参数为object, string 返回值为int的委托
Func<object,string,int> 表示传入参数为object, string 返回值为int的委托
Func<T1,T2,,T3,int> 表示传入参数为T1,T2,,T3(泛型)返回值为int的委托
Func至少0个参数,至多16个参数,根据返回值泛型返回。必须有返回值,不可void
Func<int, int> func = (a) => { return a; };
Console.WriteLine(func(8));
//输出:8
(2). Action
Action是无返回值的泛型委托。
Action 表示无参,无返回值的委托
Action<int,string> 表示有传入参数int,string无返回值的委托
Action<int,string,bool> 表示有传入参数int,string,bool无返回值的委托
Action<int,int,int,int> 表示有传入4个int型参数,无返回值的委托
Action至少0个参数,至多16个参数,无返回值。
Action<string> act = (a) => Console.WriteLine("hello world"+a);
act("北京");
//输出:hello world 北京
(3) .predicate
predicate 是返回bool型的泛型委托
predicate<int> 表示传入参数为int 返回bool的委托
Predicate有且只有一个参数,返回值固定为bool
例:public delegate bool Predicate<T> (T obj)