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

  • 相关阅读:
    [转]JIRA 7.2.6与Confluence 6.0.3的安装与配置之MS SQL Server版
    Vue中computed和watch使用场景和方法
    vue插槽 slot 插槽之间的父子传参
    VUE 父子组件的传递 props、$ref 、 $emit、$parent、$children、$root
    div水平居中 垂直居中
    三次握手 四次挥手
    TCP/IP各层网络协议的通俗理解
    学习 cookie session 正向代理和反向代理的区别
    学习vuex心得体会
    登陆界面 跟后台对接口
  • 原文地址:https://www.cnblogs.com/Opiece/p/4637638.html
Copyright © 2020-2023  润新知