上位机委托与事件学习心得

委托是一类相同函数(返回值类型与参数列表一致)的链表。什么是返回值类型与参数列表一致的函数?这个很容易理解。如以下代码所示:
  1. void showName(string name)

  2. {

  3. }

  4. void showTitle(string title)

  5. {

  6. }

上面说了委托是链表。然后你在声明委托的时候,要说明链表中函数的返回类型与参数列表,比如我声明返回类型为void,参数列表为string的委托。

 
  1. delegate void func(string f);

  2. //我声明的func与下面两个函数返回类型与参数列表一致

  3. void showName(string name)

  4. {

  5. }

  6. void showTitle(string title)

  7. {

  8. }

  9. delegate int func2(int x, int y);

  10. //我声明的func2与下面两个函数返回类型与参数列表一致

  11. int plus(int x,int y){

  12. return x + y;

  13. }

  14. int mult(int x, int y) {

  15. return x * y;

  16. }

上面提到很多“委托”这个词,其实后面还有省略的两个字“类型”。你声明委托是声明了一种类型。声明以后就可以把该类型当参数传入。

 
  1. delegate void func();

  2. void showName(func name)

  3. {

  4. }

以上func name并没有报错因为声明委托结束,代码中就有了func这个类型。既然有类型,那么我们就可以根据类型生成实例。比如

 
  1. delegate void func();

  2. func l;

我们定义了一个返回值为void,无参数的func类型的链表。然后声明了一个具体实例l。这里用l就是list的意思,帮助大家容易理解。然后就可以往链表里添加函数。使用符号“+=”

 
  1. delegate void func(string f);

  2. static func l;

  3. static void showName(string name)

  4. {

  5. }

  6. static void showTitle(string title)

  7. {

  8. }

  9. static void Main(string[] args)

  10. {

  11. //这里两个函数要加static(静态的)不然需要你通过具体类来引用,委托同理。

  12. l += showName;

  13. l += showTitle;

  14. }

通过以上操作,你就在函数链表l添加了showName与showTitle两个函数。这里很像长鞭炮,你把函数串联起来了。如果你调用l这个委托,就相当于点燃了引线,所有函数就会依次运行一遍。

 
  1. delegate void func(string f);

  2. static func l;

  3. static void showName(string name)

  4. {

  5. Console.WriteLine("你先输出了名字,参数:"+name);

  6. }

  7. static void showTitle(string title)

  8. {

  9. Console.WriteLine("你又输出了主题,参数:"+title);

  10. }

  11. static void Main(string[] args)

  12. {

  13. l += showName;

  14. l += showTitle;

  15. l("一个参数");

  16. Console.ReadKey();

  17. }

当然你可以传入函数,在调用函数,效果一样。

 
  1. delegate void func(string f);

  2. static func l;

  3. static void showName(string name)

  4. {

  5. Console.WriteLine("你先输出了名字,参数:"+name);

  6. }

  7. static void showTitle(string title)

  8. {

  9. Console.WriteLine("你又输出了主题,参数:"+title);

  10. }

  11. static void run(func l) {

  12. l("一个参数");

  13. }

  14. static void Main(string[] args)

  15. {

  16. l += showName;

  17. l += showTitle;

  18. run(l);

  19. Console.ReadKey();

  20. }

链表模型(l的模型)

showName()showTitle()

如果使用=号将清空链表,使链表中只剩最后一个等号后的函数。也可以使用-=,来清除对应的函数。这里请大家自行测试。

具有返回值的委托类型,返回值默认是最后一个函数的返回值,就是最后添加的返回值。

 
  1. delegate int func(int j,int k);

  2. static func l;

  3. static int plus(int x,int y){

  4. return x + y;

  5. }

  6. static int mult(int x, int y) {

  7. return x * y;

  8. }

  9. static void Main(string[] args)

  10. {

  11. l += plus;

  12. l += mult;

  13. Console.WriteLine(l(4,5));

  14. Console.ReadKey();

  15. }

运行以上返回值是20,结果是最后一个函数返回值。如何获取每个函数的返回值,这里写了一个示例:

 
  1. delegate int func(int j,int k);

  2. static func l;

  3. static int plus(int x,int y){

  4. return x + y;

  5. }

  6. static int mult(int x, int y) {

  7. return x * y;

  8. }

  9. static void Main(string[] args)

  10. {

  11. l += plus;

  12. l += mult;

  13. foreach(Delegate i in l.GetInvocationList()){

  14. func k=(func)i;

  15. Console.WriteLine(k(4,5));

  16. }

  17. Console.ReadKey();

  18. }

委托就讲到这里,重新概括一下就是

  1. 委托是一种类型
  2. 委托是一种类型与返回值相同函数的链表
  3. 委托使用+=,=,-=三个符号操作链表里的函数
  4. 调用委托就会依次调用委托链表里的所有函数
  5. 委托返回值默认是最后一个添加的函数返回值

关于事件(event)

事件是一种特殊的委托,事件需要与类结合起来理解。

首先明确关键字event在实例化委托时使用而非定义委托时使用。

委托定义与使用

 
  1. delegate void func();

  2. static func l;

注意关键字的位置,在实例化的时候使用event;

事件需要与类结合起来,定义事件的类才可以调用事件。

 
  1. delegate void func();

  2. class Program

  3. {

  4. static void Main(string[] args)

  5. {

  6. Person.l();//这里报错Person.l”只能出现在 += 或 -= 的左边(从类型“Person”中使用时除外)

  7. Console.ReadKey();

  8. }

  9. }

  10. class Person{

  11. public static event func l;//这里定义事件

  12. void Action() {

  13. l();//这里没有报错因为这里在定义事件的类里。

  14. }

  15. }

之前讲过,委托就像是一串鞭炮。将函数链接与取消或者触发,可以自由使用。但是事件限定了只能由声明事件的类来触发。而链接函数的过程,可以看做一种通知。这里写一个黑人抬棺的例子帮助大家理解

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值