3个回答
推荐于2016-07-18
展开全部
委托实质上是一个类,是对方法的封装,委托内部有三个重要成员:目标,方法,前一个委托。普通代码里这样调用方法: aBird.Fly(); 封装到委托里,aBird 就是目标,Fly 就是方法。委托可以组成链,“前一个委托”用于支持这种链式结构。 MethodInvoker mi = new MethodInvoker(aBird.Fly); mi(); 这段和上面的 aBird.Fly 是一个效果,但不是直接调用。可以将 mi 传递到其他地方,再进行调用。委托在方法和调用方之间建立了间接性。 事件是基于委托的通信机制。如果一个对象的状态改变了,我们可能希望将这种改变通知给外界。从实现角度看,“通知”其实就是调用接收方的方法。困境在于,我们不知道谁对这些改变有兴趣,有多少人对这些改变有兴趣,所以,我们无法直接调用方法。.net中有两个办法解决这个问题,接口和委托。这两个的含义都是“约定”,目的则是“分离”,换句话说,就是:商量好了,分头行动。接口是对类成员的约定,委托是对参数和返回值的约定。对于简单的通知,接口有些麻烦,委托更好一些,所以,我们将一个委托加到类中,让它保存应该调用的方法。但光秃秃的一个字段有点难看,好像没穿衣服一样。为了让代码更好看,.net 引入了事件的概念。事件本质上是一个方法,事件提供 add, remove,将方法挂到这个委托中,或从此委托中移除。像这样: button1.Click += new EventHandler(button1_Click), 订阅事件, button1.Click -= new EventHandler(button1_Click), 退阅事件, 如果A订阅了B的事件,那么它们之间的引用关系是这样:B引用委托,委托引用A。这就是说,在退阅事件之前,A不会被当作垃圾回收,因为B包含对它的引用。 因此,委托和事件的区别是:委托与类,结构,接口,枚举是一类,而事件属类成员,和属性,方法,字段是一类。不过这种区分意义不大,应付考官而已。写代码的时候,谁会想这么多。
2013-10-19
展开全部
用C# 简单的实例讲述什么是委托及以事件的定义与使用
委托可以这么来理解,委托就像是定义一个指针(C++),提供入口。
1 实例1:执行一个委托定义的方法
第一步:定义一个委托
public delegate void Computer(); //委托用delegate定义,此方法是void类型,并且没有任何参数
第二步:定义一个和委托类型相同的方法,计算两数之和
private void MathOpt()
{
int a =1;
int b = 2;
int sum=a +b;
Response.Write(sum.tostring());
}
第三步:在一个按钮的click事件中
private void button1_Click(object sender, EventArgs e)
{
Computer com;//实例
com = MathOpt;//类似指针,将方法的地址赋值委托类型的变量
com();
}
好了,这样就执行了一个委托的方法,当系统执行到com()的时候,就相当于执行方法MathOpt(),如果有参数,那么在定义委托的时候和方法有相同的参数即可。
有了委托就可以定义事件了
实例2:定义一个事件
功能:在父子窗体间通信,如在子窗体输入条件,在父窗体中查询,类似Office的查找
定义窗体:假设父窗体为Frm1,子窗体为Frm2
第一步在Frm2中定义事件:
public delegate void FullSearch(string key); //定义全文检索的委托事件
public event FullSearch FullSearchOrder; //用委托定义一个检索的事件(会在父窗体中执行功能)
第二步在Frm2的“查询”按钮事件中执行:
private void btnSearch_Click(object sender, System.EventArgs e)
{
if(FullSearchOrder !=null)
FullSearchOrder(this.txtKey .Text ); //此时不用考虑如何查询,只传递一个查询关健字即可
}
第三步转到Frm1中处理事件
3-1 在父窗体中的弹出子窗体时产生定义的那个事件方法:如
Frm2 frm2=new Frm2(key); //key为要查询的关健字,与定义事件方法参数保持一至
frm2.FullSearchOrder +=new .Frm2.FullSearch(frm2_FullSearchOrder); //执行这句会自动产生一个事件frm1_FullSearchOreder
frm2.ShowDialog ();
3-2 在系统产生的事件中完成查询功能就OK了
private void frm2_FullSearchOrder(string key)
{
//这里完成查询的方法
}
到这里就好了,不同窗体间就可以通信了,在弹出的子窗体中就可以执行父窗体中的方法了,原理都是利用委托。
委托可以这么来理解,委托就像是定义一个指针(C++),提供入口。
1 实例1:执行一个委托定义的方法
第一步:定义一个委托
public delegate void Computer(); //委托用delegate定义,此方法是void类型,并且没有任何参数
第二步:定义一个和委托类型相同的方法,计算两数之和
private void MathOpt()
{
int a =1;
int b = 2;
int sum=a +b;
Response.Write(sum.tostring());
}
第三步:在一个按钮的click事件中
private void button1_Click(object sender, EventArgs e)
{
Computer com;//实例
com = MathOpt;//类似指针,将方法的地址赋值委托类型的变量
com();
}
好了,这样就执行了一个委托的方法,当系统执行到com()的时候,就相当于执行方法MathOpt(),如果有参数,那么在定义委托的时候和方法有相同的参数即可。
有了委托就可以定义事件了
实例2:定义一个事件
功能:在父子窗体间通信,如在子窗体输入条件,在父窗体中查询,类似Office的查找
定义窗体:假设父窗体为Frm1,子窗体为Frm2
第一步在Frm2中定义事件:
public delegate void FullSearch(string key); //定义全文检索的委托事件
public event FullSearch FullSearchOrder; //用委托定义一个检索的事件(会在父窗体中执行功能)
第二步在Frm2的“查询”按钮事件中执行:
private void btnSearch_Click(object sender, System.EventArgs e)
{
if(FullSearchOrder !=null)
FullSearchOrder(this.txtKey .Text ); //此时不用考虑如何查询,只传递一个查询关健字即可
}
第三步转到Frm1中处理事件
3-1 在父窗体中的弹出子窗体时产生定义的那个事件方法:如
Frm2 frm2=new Frm2(key); //key为要查询的关健字,与定义事件方法参数保持一至
frm2.FullSearchOrder +=new .Frm2.FullSearch(frm2_FullSearchOrder); //执行这句会自动产生一个事件frm1_FullSearchOreder
frm2.ShowDialog ();
3-2 在系统产生的事件中完成查询功能就OK了
private void frm2_FullSearchOrder(string key)
{
//这里完成查询的方法
}
到这里就好了,不同窗体间就可以通信了,在弹出的子窗体中就可以执行父窗体中的方法了,原理都是利用委托。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-10-19
展开全部
你的问题有些模糊啊,我不知道是问事件还是问委托?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
您可能需要的服务
百度律临官方认证律师咨询
平均3分钟响应
|
问题解决率99%
|
24小时在线
立即免费咨询律师
15719人正在获得一对一解答
苏州天空之城3分钟前提交了问题
上海旋风骑士2分钟前提交了问题
合肥云端漫步2分钟前提交了问题