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