C#——委托和事件

一、委托

        说道委托,很多的教材上都说是类似于C语言上的指针,但是以我理解的程度来看,更像是复制这个方法或函数的使用,因为委托可以看成是一个数据类型一样的东西,传递进去的是函数或方法。但是这在我看来更像是植物大战僵尸中的克隆者,因为使用的方法和原来的函数没有什么两样,再者说就是可以少写一个对象名,另一方面说道委托就是程序委托给这个函数去完成某个事件,是一个中间者的境地。(Ps:从另一方面更像是数据库中对表或者方法的重命名)

        接下来让我们来看一下委托的简单实现:
    由于委托是委托的方法,所以要先定义一个方法:
public class MathOpt
{
       public  int Add (int argument1,int argument2)     //一个相加的方法
      {
           rerturn  argument1+argument2; 
      }
}
    然后是定义委托 :
public delegate int MathOptDelegate(int value1,int value2);     //定义委托
  (注意委托的关键字是delegate)
    然后是使用:
static  void Main(string[] args)
{
       MathOptDelegate  oppDel;              //声明委托变量
       MathOpt  obj = new MathOpt();        //声明函数对象
       
       oppDel = obj.Add;                    //给委托变量附上对象的方法
       Console.WriteLine(oppDel(1,2));      //使用(传递的参数和被委托的方法一样)
}

    最后输出的是3,由此证明了传进委托对象的函数确实执行了对象obj的add方法。
(注意声明委托的类型要和方法返回的值的类型一致)

        多重委托:
       多重委托实际上也是通过委托和委托之间的叠加来实现的,但是要求是参数必须相同而且返回值为空。多重委托最常用的两个方法是Combine()和Remove(),实际使用的时候用"+、-"代替。
例子:
delegate void Dg(string str);      //定义委托

class A                            //定义类
{
     public  static void H(string str)
    {
          console.writeline("hello,{0}",str);
    }
    public  static  void G(string  str)
    {
          console.writeline("Goodbye,{0}",str);
    }
}
class  Myclass
{
    public static Main(string[] args)
    { Dg  a,b,c,d;                      //声明委托对象
      a=new  Dg(A.H);                   //委托a指向A的H方法
      b=new  Dg(A.G);                   //委托b指向A的G方法
      c=a+b;                            //创建多重委托
      d=c-a;                            //把a从多重委托中移除
      console.writeline("Invoke  delegate  a:");
      a("A");
      console.writeline("Invoke  delegate  b:");
      b("B");
      console.writeline("Invoke  delegate  c:");
      c("C");
      console.writeline("Invoke  delegate  d:");
      d("D");
    }
}
运行结果:
 Invoke  delegate  a:
  hello,A
Invoke  delegate  b:
  Goodbye,B
Invoke  delegate  c:
  hello,C
  Goodbye,C
Invoke  delegate  d:
  Goodbye,D

二、事件

        我们都知道在面向对象的程序设计中,消息的传递有的时候是程序出发的根本,所以有些功能的执行就需要消息去通知他们,在这里我们用事件的触发来传递消息实现功能的执行。
        事件的声明格式(举例);
       public delegate void a;
       public event a Click;
其中event后面跟的必须是一个委托,委托后面是执行事件。所以有事件必有委托。

事件的预定和撤销:
        事件需要预定才能被触发,而已经预定了的事件也可以被撤销,预定和撤销的操作符分别是”+=“和”-=“。
使用:OkButton.Click=new EventHandler(OkButtonClick);
有的时候感觉以前vb中用的句柄函数可能也是通过这种方式实现的。(EventHandler感觉有句柄的意思)
        由于视频中没有提到多少事件的事情,所以也只能总结到此。

三、总结

        委托和事件在实际的应用上有很多的关联,所以要放在一起学习,有很多巧妙的例子都是用事件写成的。委托可以看作是C#中的指针,所以也需要重要的把控一下。
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值