C#委托简介
C#中委托是一种引用类型,该引用类型与其他引用类型不同,在委托对象的引用中存放的不是对数据的引用而是存放对方法的引用,即委托的内部包含一个指向某个方法的指针。通过使用委托把方法的引用封装在委托对象中,然后将委托对象传递给调用引用方法的代码。
声明格式如下:
【修饰符】delegate 【返回类型】 【委托名称】(【参数列表】)
与委托类型相匹配的方法必须满足以下两个条件:
1、 具有相同的签名,即具有相同的参数数目,并且类型相同,顺序相同,参数的修饰符也相同
2、 具有相同的返回类型
委托是安全的,它与其他所有的C#成员一样是一种数据类型,并且任何委托对象都是System.Delegate的某个派生类的一个对象。结构图如下:
如何使用委托?
1、定义委托类型
[访问修饰符]delegate 返回类型 委托名(形参);
2、声明委托对象
委托名 委托实例名;
3、创建委托对象(确定与哪些方法进行绑定)
委托实例名=new 委托名(某个类的方法)
4、使用委托调用方法
委托实例名(实参)
委托注意事项:
1、委托和方法必须具有相同的参数。
2、委托可以调用多个方法,即一个委托对象可以维护一个可调用方法的列表而不是单独的一个方法,称为多路广播(多播)。
3、使用+=和-=运算实现方法的增加和减少
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using Delegate; 6 7 namespace Delegate 8 { 9 10 public delegate int Call(int num1, int num2);//第一步:定义委托类型 11 class SimpleMath 12 { 13 // 乘法方法 14 public int Multiply(int num1, int num2) 15 { 16 return num1 * num2; 17 } 18 19 // 除法方法 20 public int Divide(int num1, int num2) 21 { 22 return num1 / num2; 23 } 24 } 25 } 26 class Test 27 { 28 static void Main(string[] args) 29 { 30 Call objCall;//第二步:声明委托对象 31 // Math 类的对象 32 SimpleMath objMath = new SimpleMath(); 33 // 第三步:创建委托对象,将方法与委托关联起来 34 objCall = new Call(objMath.Multiply); 35 36 Call objCall1 = new Call(objMath.Divide); 37 objCall += objCall1;//向委托增加一个方法 38 //objCall -= objCall1;//向委托减去一个方法 39 // 调用委托实例,先执行objMath.Multiply,然后执行objMath.Divide 40 int result = objCall(5, 3); 41 System.Console.WriteLine("结果为 {0}", result); 42 Console.ReadKey(); 43 } 44 }
写法:
1、委托 委托名=new 委托(会调用的方法名); 委托名(参数);
2、委托 委托名 =会调用的方法名; 委托名(参数);
3、匿名方法
委托 委托名=delegate(参数){会调用的方法体};委托名(参数);
4、拉姆达表达式
委托 委托名=((参数1,。。参数n)=>{会调用的方法体});委托名(参数);
5、用Action<T>和Func<T>,第一个无返回值
Func<参数1, 参数2, 返回值> 委托名= ((参数1,参数2) => {带返回值的方法体 });返回值=委托名(参数1,参数2);
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using @delegate; 6 7 namespace @delegate 8 { 9 public delegate int Call(int num1, int num2); 10 class SimpleMath 11 { 12 // 乘法方法 13 public static int Multiply(int num1, int num2) 14 { 15 return num1 * num2; 16 } 17 18 // 除法方法 19 public int Divide(int num1, int num2) 20 { 21 return num1 / num2; 22 } 23 } 24 class Test 25 { 26 static void Main(string[] args) 27 { 28 //--------------------第一种写法------------------------// 29 //Call objCall = new Call(SimpleMath.Multiply); 30 //Call objCall1 = new Call(new SimpleMath().Divide); 31 //--------------------第二种写法------------------------// 32 //Call objCall = SimpleMath.Multiply; 33 //Call objCall1 = new SimpleMath().Divide; 34 //--------------------第三种写法------------------------// 35 //Call objCall = delegate(int a, int b) 36 //{ 37 // return a * b; 38 //}; 39 //Call objCall1 = delegate(int a, int b) 40 //{ 41 // return a / b; 42 //}; 43 //--------------------第四种写法------------------------// 44 //Call objCall =((int a,int b)=> { return a*b;}); 45 //Call objCall1 = ((int a, int b) => { return a / b; }); 46 //--------------------第五种写法------------------------// 47 Func<int, int, int> objCall = ((a, b) => { return a * b; }); 48 Func<int, int, int> objCall1 = ((a, b) => { return a / b; }); 49 Action<int, int> ob = ((a, b) => { Console.WriteLine(a * b); }); 50 ob(5, 3); 51 //----------------------------------------------------// 52 int result = objCall(5, 3); 53 int result1 = objCall1(5, 3); 54 System.Console.WriteLine("结果1为 {0},结果2为{1}", result,result1); 55 Console.ReadKey(); 56 } 57 } 58 }
注:部分内容转自http://www.cnblogs.com/Blackieboy/articles/2203346.html