privatedelegatestringGetAString();//定义了一个委托类型,这个委托类型的名字叫做GetAString方法内部//示例1 委托的赋值和使用的两种方式int x =40;//使用委托类型 创建实例GetAString a =newGetAString(x.ToString);//a指向了x中的tostring方法GetAString a = x.ToString;//常用赋值方式string s =a();//通过委托实例去调用 x中的tostring方法string s = a.Invoke();//通过invoke方法调用a所引用的方法
Console.WriteLine(s);//通过委托类型去调用一个方法,跟直接调用这个方法作用是一样的
3. Action 委托
Action 委托引用了一个void返回类型的方法,T表示方法参数
Action
Action<in T>
Action<in T1,in T2>
Action<in T1,in T2 ....in T16>//示例开始 Action a = PrintString;//action是系统内置(预定义)的一个委托类型,它可以指向一个没有返回值,没有参数的方法
Action<int> a = PrintInt;//定义了一个委托类型,这个类型可以指向一个没有返回值,有一个int参数的方法
Action<string> a = PrintString;//定义了一个委托类型,这个类型可以指向一个没有返回值,有一个string参数的方法,如果有重名方法,系统会自动寻找匹配的方法
Action<int,int> a = PrintDoubleInt;a(34,23);//action可以后面通过泛型去指定action指向的方法的多个参数的类型 ,参数的类型跟action后面声明的委托类型是对应着的//PrintString(+1 重载), PrintInt, PrintDoubleInt 静态方法的实现略
4. Func 委托
Func引用了一个带有一个返回值的方法,它可以传递0或者多到16个参数类型,和一个返回类型
Func<out TResult>
Func<in T,out TResult>
Func<in T1,in T2 ....in T16,out TResult>//示例开始//func后面必须指定一个返回值类型,参数类型可以有0-16个,先写参数类型,最后一个是返回值类型
Func<int,int,int> a = Test3;int res =a(1,5);//方法的定义staticintTest3(int i,int j){return i + j;}
//多播委托Action a = Test1;
a += Test2;//表示添加一个委托的引用
a -= Test1;//删除一个委托的引用
a -= Test2;if(a!=null){a();//当一个委托没有指向任何方法的时候,调用的话会出现异常null }//方法的定义staticvoidTest1(){
Console.WriteLine("test1");//throw new Exception();}staticvoidTest2(){
Console.WriteLine("test2");}//取得多播委托中所有方法的委托
Delegate[] delegates = a.GetInvocationList();foreach(Delegate de in delegates){
de.DynamicInvoke();}