委托与事件
来源:互联网 发布:淘宝企业店铺复核吗 编辑:程序博客网 时间:2024/06/06 06:54
委托就是以方法做参数进行传递,它定义的是方法的框架,如果用这个委托,所声明的方法就必须按照给定的参数及返沪类型进行处理。
声明委托的方式:delegate 返回值类型 委托类型名(参数) 比如delegate void StringProcess(string s); 注意这里的除了前面的delegate,剩下部分和声明一个函数一样,但是StringProcess不是函数名,而是委托类型名
存储什么样的方法就声明什么类型(方法参数与返回值)的委托。声明的委托是一种类型,就像int、Person一样,如果要用的话还要声明委托类型的变量,声明委托类型变量的方式:StringProcess f1;
将委托类型变量指向函数 StringProcess sp = new StringProcess(SayHello),这样就可以像调用普通函数一样把sp当成函数用了。委托可以看做是函数的指针。整数可以用整数变量指向它,对象可以用对象变量指向它,函数也可以用委托变量指向它。和直接调用函数的区别:用委托就可以指向任意的函数,哪怕是之前没定义的都可以,而不使用受限于那几种。
将委托类型变量指向函数还可以简化成StringProcess sp = SayHello,编译器帮我们进行了new。但是不能sp=PrintIt(),因为这样就成了函数调用。
例子: //1定义委托类型
delegate void DGSayHi(string name);
//2声明委托类型对象
DGSayHi dgSayHi = null;
//2.1声明一个 与 DGSayHi委托类型有相同 签名的方法
void SayNiHao(string name2)
{
MessageBox.Show("您好啊~~~" + name2);
}
//2.2声明一个 与 DGSayHi委托类型有相同 签名的方法
void SayHi(string name2)
{
MessageBox.Show("Hi~~~" + name2);
}
//2.3声明一个 与 DGSayHi委托类型有相同 签名的方法
void SayJpa(string name2)
{
MessageBox.Show("OHaU~~~" + name2);
}
//2.4声明一个 与 DGSayHi委托类型有相同 签名的方法
void SayKor(string name2)
{
MessageBox.Show("AniASaiU~~~" + name2);
}
private void btnTest_Click(object sender, EventArgs e)
{
//3实例化 委托对象
dgSayHi = new DGSayHi(SayNiHao);
//3.1向委托对象中追加了一个方法
dgSayHi += SayHi;
//上句代码 实际执行 如下
//dgSayHi = (DGSayHi) Delegate.Combine(dgSayHi, new DGSayHi(SayHi));
//4声明一个新的委托对象
DGSayHi dgSayHi2 = new DGSayHi(SayJpa);
dgSayHi2 += SayKor;
//5将新委托对象 追加到 原来的委托对象中
dgSayHi += dgSayHi2;
//6.从委托中移除方法
dgSayHi -= SayJpa;
//dgSayHi = (DGSayHi) Delegate.Remove(dgSayHi, new DGSayHi(SayJpa));
//调用委托对象
dgSayHi("Lily");
//dgSayHi.Invoke("Lucy");
delegate:
使用Delegate的时候很多时候没必要使用一个普通的方法,因为这个方法只有这个Delegate会用,并且只用一次,这时候使用匿名方法最合适。
匿名方法就是没有名字的方法。3就是没有名字的int对象。3+5就是两个匿名int对象的相加,允许匿名对象,就允许匿名方法。
ProcessWordDelegatep = delegate(string s)
{
Console.WriteLine(s);
};
知道C#中有匿名方法,看到这种写法知道是匿名函数即可。
多播委托
delegatevoidProcessWordDelegate(strings)
ProcessWordDelegated = new ProcessWordDelegate(SayHello)+newProcessWordDelegate(ToLower)
多播委托如何处理返回值?
•委托绑定多个方法后,其中一个方法执行发生异常后面的方法还会继续执行吗?不会!
•一个重要的方法GetInvocationList();//返回一个Delegate[]类型。Delegate类是一个抽象类,是所有委托的父类。
组合的委托必须是同一个类型
相当于创建了一个按照组合的顺序依次调用的新委托对象。
委托的组合一般是给事件用的,用普通的委托的时候很少用
加了event关键字实现事件机制的好处:用了event事件,不可以修改事件已经注册的值;不可以冒充进行事件通知了。在IntUC类外部就不能通过OnInt(3)的方式调用注册的委托了。只能+=、-=!
委托与事件的区别
委托和事件没有可比性,因为委托是类型,事件是对象(可以理解为对委托变量的封装。d),下面说的是委托的对象(用委托方式实现的事件)和(标准的event方式实现)事件的区别。事件的内部是用委托实现的。(举例子:三种实现事件方式的区别)
因为对于事件来讲,外部只能“注册自己+=、注销自己-=”,外界不可以注销其他的注册者,外界不可以主动触发事件,因此如果用Delegate就没法进行上面的控制,因此诞生了事件这种语法。add、remove。
事件是用来阉割委托实例的。事件只能add、remove自己,不能赋值。事件只能+=、-=,不能=、不能外部触发事件。
总结:
委托的作用:
占位,在不知道将来要执行的方法的具体代码时,可以先用一个委托变量来代替方法调用(委托的返回值,参数列表要确定)。在实际调用之前,需要为委托赋值,否则为null。
事件的作用:
事件的作用与委托变量一样,只是功能上比委托变量有更多的限制。(比如:1.只能通过+=或-=来绑定方法(事件处理程序)2.只能在类内部调用(触发)事件。)
在自定义控件(自己编写控件的时候,会大量用到.编写控件的时候,会写一些事件。但是当这些事件 被触发以后,具体执行的那些事件处理程序是编写控件的人没法确定的。这个时候只能通过事件来占位(调用),具体调用的是哪个方法,由使用控件的人来决定(Click+=new 委托(方法名);))
- 委托入门-事件与委托
- 委托与事件
- 委托与事件
- c# 委托与事件
- 委托与事件
- 事件与委托详解
- 委托与事件详解
- 委托与事件详解
- 委托与事件
- C#委托与事件
- 委托与事件
- 委托与事件
- 事件与委托趣谈
- 事件与委托
- 事件与委托趣谈
- 事件与委托
- 事件与委托趣谈
- 事件与委托趣谈
- C++《如何发布MFC项目的release版本》
- 40 个很有用的 Mac OS X Shell 脚本和终端命令
- base64转换成图片,并打ZIP包
- Intel GMA DVM SVM SSM In XP Vista Win7
- 把matlab的figure窗口合并到主窗口中
- 委托与事件
- hdu1281 二分匹配
- Tomcat 容器的交互过程
- 动态指定 通用查询面板上的最大返回记录数
- xfire NamespaceURI cannot be null
- tomcat用log4j打日志设置
- 简易计算器
- Struts S2-016 远程任意命令执行漏洞检测代码
- jQuery.load的用法