C#中的委托与事件是很重要的概念,要学好C#,必须冲破这一关。
1.委托
关键字delegate,委托,它与类、枚举、结构、接口一样,也是一种类型。
由于委托是代表了一类具有相同参数列表和返回值的函数,委托定义的变量用于保存具有相同签名的函数实体,它可以指代任何函数。所以,我们说类是对象的抽象,那么委托就可以看成是函数的抽象。
委托的好处:
1.将方法动态地赋给参数,可以避免在程序中大量使用if-else(switch-case)语句,使程序具有良好的可扩展性。
2.可以把函数本身的处理逻辑抽象出来,由调用者决定最终使用什么样的逻辑去处理。
委托的用法,请看下面的代码
1 //委托与类、枚举、结构、接口一样,也是一种类型 2 //一个委托代表了具有相同参数列表和返回值的所有函数 3 delegate int GetCalculatedValueDelegate(int x, int y); 4 delegate void GreetingPeople(); 5 6 static int AddValue(int x,int y) 7 { 8 return x + y; 9 } 10 11 static int SubValue(int x, int y) 12 { 13 return x - y; 14 } 15 16 static int MulValue(int x, int y) 17 { 18 return x * y; 19 } 20 21 static void EnglishGreating() 22 { 23 Console.WriteLine("Hello"); 24 } 25 26 static void ChineseGreeting() 27 { 28 Console.WriteLine("你好"); 29 } 30 31 //委托作为函数的参数来使用 32 //一个委托实体可以指代任何函数 33 static int CalculateValue(GetCalculatedValueDelegate fun,int x,int y) 34 { 35 return fun(x, y); 36 } 37 38 static void Main(string[] args) 39 { 40 Console.WriteLine("委托作为参数来使用"); 41 Console.WriteLine(CalculateValue(SubValue, 50, 20)); 42 43 Console.WriteLine("委托使用 += 和 -="); 44 GetCalculatedValueDelegate de = new GetCalculatedValueDelegate(AddValue); 45 de += SubValue; 46 de -= AddValue;//取消对AddValue方法的绑定 47 Console.WriteLine(de(20, 20)); 48 49 Console.WriteLine("给一个委托绑定多个方法"); 50 GetCalculatedValueDelegate d = AddValue;//给委托赋值 51 d += SubValue; //给委托再绑定一个函数 52 d += MulValue; //给委托再绑定一个函数 53 Console.WriteLine(d(100, 30)); 54 55 GreetingPeople greeting = null; 56 greeting += EnglishGreating; 57 greeting += ChineseGreeting; 58 greeting(); 59 }
运行结果:
因为委托也是一种类型,所以我们可以进行操作的运算符主要有 = (赋值操作)、 += (把一个方法绑定到一个委托变量上)、 -=(取消绑定)。 要注意的是:无返回值的委托,你给它注册多少个方法,它就执行多少个方法,而有返回值的委托,同样注册多少个方法就执行多少个方法,但返回的是最后一个方法的返回值。所以上面的程序中,我们给委托d绑定了3个有返回值的方法,但最终返回的是MulValue的返回值;我们给委托greeting绑定了2个方法,最终我们看到了这两个方法的执行结果。
关于委托的+=和-=的工作原理,请查看http://www.jb51.net/article/59449.htm
委托的缺点:在上面的程序中,我们可以随意地给委托进行赋值,破坏了程序的封装性,所以接下来该事件出场了。
接下来请看:委托与事件——事件。
时间: 2024-10-23 16:58:08