zoukankan      html  css  js  c++  java
  • C#中的委托与事件

    1,委托?

       通俗来讲,就是一个能存放符合某种格式(签名)的方法的指针 的容器  (可以将方法作为一个参数来传递到另一个方法内执行)

       定义委托:delegate string DelegateSayHi(string uName);

       创建委托对象: DelegateSayHi dg=new DelegateSayHi (与委托有相同前面的方法);

       委托的存在目的 就是为了一次性调用所有的方法 

       委托对象追加方法:dg+=fun1

       委托对象删除方法:dg-=fun1;

       执行委托:dg("name");   等同于 dg.invork("name");

       委托必须要存在一个方法

    委托的使用:

    1.0 委托作为参数

            public delegate string DGTest(string name);
            
           string ShowSmile(string name, DGTest dgt)
            {
                return dgt(name);
            }
            private void button1_Click(object sender, EventArgs e)
            {
                string returnMess = ShowSmile("小白", Test2);
                MessageBox.Show(returnMess);
            }
          
            string Test1(string name)  { return "哈哈 " + name; } 
            string Test2(string name) { return "嘻嘻 " + name; } 
            string Test3(string name) { return "呵呵 " + name;  }
    

    2.0 委托作为返回值

     public delegate string DGTest(string name);      
    private void button2_Click(object sender, EventArgs e)
            {
                DGTest dgt = ShowSmile(3);
                string mess = dgt("小小小米");
                MessageBox.Show(mess);
            }
           
          DGTest ShowSmile(int i)
            {
                switch (i)
                {
                    case 1: return Test1;
                    case 2: return Test2;
                    default: return Test3;
                }
            }
    
    事件
    由于委托有如下缺点
    1.可以将Null赋予 委托会导致当前委托容器被清空
    2.可以直接将某个方法赋值给委托
    为了防止将委托对象清空,所以微软引入了事件
     
    事件特点:事件只能出现在+=和-=的坐标位置,意味着不能对事件进行任何赋值操作,就保护了委托中已经存在的方法

     

     

    C#中的委托是什么?事件是不是一种委托?事件和委托的关系。

    1,委托可以把一个方法作为参数代入另一个方法。

    2,委托可以理解为指向一个函数的指针。

    3,委托和事件没有可比性,因为委托是类型,事件是对象。

    下面说的是委托的对象(用委托方式实现的事件)和(标准的 event 方式实现)事件的区别。

    事件的内部是用委托实现的。因为对于事件来讲,外部只能“注册自+=、注销自己-=”,外界不可以注销其他的注册者,外界不可以主动触发事件,因此如果用 Delegate 就没法进行上面的控制,因此诞生了事件这种语法。事件是用来阉割委托实例的,类比用一个自定义类阉割 List。事件只能 add、remove 自己,不能赋值。事件只能+=、-=,不能= 。加分的补充回答:事件内部就是一个 private的委托和 add、remove 两个方法。

  • 相关阅读:
    Mysql中Unsigned和Zerofill数据型的使用
    laravel Excel导入导出
    saas的资料
    Mysql的row_format(fixed与dynamic)
    第七节 css3动画之transform位移
    第六节 css3动画之transform变换
    第五节 css3动画之图片说明滑入效果
    第四节 css3动画之transition
    第三节 css3动画之透明
    第二节 css3动画之圆角
  • 原文地址:https://www.cnblogs.com/Sunlimi/p/4181699.html
Copyright © 2011-2022 走看看