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 两个方法。

posted @ 2014-12-24 09:43  10:00  阅读(465)  评论(0编辑  收藏  举报