C#——委托与事件

    首先,来了解一下什么是委托,什么是事件,这两者之间有什么区别?

    委托:

    (1)是一种数据类型,可以像类一样声明数据类型,声明变量

    (2)只有委托才能将方法当做变量来保存

    (3)不同类型的方法需要使用不同的委托类型来存储,所以不同类型的方法需要定义不同的类来存储不同的对象

    (4)同一种方法可以使用同一个委托类型来存储

先通过一小段代码来了解一下

//先定义一个委托,委托也可以声明变量,还有返回值
public delegate void MyDelegate();

 public delegate void MyDelegate1(int n,int m);
 public delegate void MyDelegate2(string msg);
public delegate int MyReturnIntDelegate();//返回为int类型的委托
    class Program
    {
        static void Main(string[] args)
        {
            M1(SayHello);//将SayHello方法作为参数传入
             MyDelegate1 d1 = Add;//直接将Add方法赋值个MyDelegate1
            d1(2, 3);
            Console.ReadKey();


            
        }

        static void SayHello()
        {
            Console.WriteLine("hello !");
        }

       static void Add(int n,int m)
{
       Console.WriteLine("MyDelegate1 Result:"+(m+n).ToString());
}
static void M1(MyDelegate say)//
        {
            say();
        }

上面运行的结果为

我们可以通过反编译来看看程序的内部实现

通过反编译我们可以看到委托继承自System.MulticastDelegate,而System.MulticastDelegate又继承自System.Delegate

    说完委托,下面来说说事件。什么是事件?事件是对象发送的消息,发送信号通知用户操作。这个操作可能是由鼠标单击引起的,也可能是由某些其他的程序逻辑触发的。例如当点击按钮,弹出一个对话框时,用户出发的点击的事件,产生了相应的相应(弹出对话框)。那么委托和事件有什么区别呢?

 
private void Form1_Load(object sender, EventArgs e)
        {
//自己定义一个登陆控件,在窗体加载的时候,myUser1注册一个事件
            myUser1.newEvent += new Action<object, myneweventargs>(myUser1_newEvent);
        }

//登陆校验
        void myUser1_newEvent(object sender, myneweventargs e)
        {
            if (e.user == "admin" && e.pwd == "8888")
            {
                e.IsOk = true;
            }
        }

在编译后通过反射我们可以看到newEvent的内部实际上就是add与remove两个方法,事件的内部是靠委托来实现的

    其实委托与事件没有太大的可比性,因为委托是一个类型,而事件是一个对象,事件的内部是通过委托来实现的,对于事件来说,内部的add与remove方法,所以事件只能通过“+=”来注册自己,或是“-=”来注销自己,外界不能主动触发事件,既事件是不能通过赋值来注册事件。

转载于:https://www.cnblogs.com/Opiece/p/4637638.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值