zoukankan      html  css  js  c++  java
  • 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方法,所以事件只能通过“+=”来注册自己,或是“-=”来注销自己,外界不能主动触发事件,既事件是不能通过赋值来注册事件。

  • 相关阅读:
    如何解决WEB应用中文乱码问题
    js获取指定格式的时间字符串
    js 实现 Base64 编码的相互转换
    Sql Server 与 MySql 在使用 update inner join 时的区别
    VMware12创建新的虚拟机及设置硬件环境
    Sql Server 中使用日期遍历
    Linux 添加定时任务,crontab -e 命令与直接编辑 /etc/crontab 文件
    mysql 中 max_allowed_packet 查询和修改
    eclipse编译项目:Java @Override 注解报错的解决方法
    eclipse启动项目报错:java.lang.ClassNotFoundException: ContextLoaderListener
  • 原文地址:https://www.cnblogs.com/Opiece/p/4637638.html
Copyright © 2011-2022 走看看