如何理解c#中的委托

 我来答
huntagain2008
2012-02-06 · TA获得超过927个赞
知道小有建树答主
回答量:999
采纳率:0%
帮助的人:398万
展开全部
委托是对函数的封装,可以当作给方法的特征指定一个名称。而事件则是委托的一种特殊形式,当发生有意义的事情时,事件对象处理通知过程。

最常见的例子就是Tom猫叫“喵,我是TOM”,有两只老鼠Jerry和Jack就说“猫来了,快跑!"
你分析一下,这两个类是如何执行?

在Main函数中执行,当Cat的Shout触发时,Mouse就执行Run。那么如何让Shout触发?显然老猫不认识老鼠,也不会主动通知它们。

委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。
委托通过delegate来声明。而事件是说在发生其他类或对象关注的事情时,类或对象可通过事件通知它们。事件对象用event声明。

class Cat
{
private string name;
public Cat(string name)
{
this.name = name;
}
public delegate void CatShoutEventHandler(); //声明委托
public event CatShoutEventHandler CatShout; //声明事件,它的事件类型 CatShoutEventHandler

public void Shout()
{
// 喵
if (CatShout != null)
{
CatShout(); //若CatShout中有对象登记,则执行
}
}

Class Mouse
{
//name 字段
//name 属性
public void Run()
{
// 跑
}
}

static void Main()
{
Cat cat = new Cat("Tom");
Mouse mouse1 = new Mouse("Jerry");
Mouse mouse2 = new Mouse("Jack");

cat.CatShout += new Cat.CatShoutEventHandler(mouse1.Run);
cat.CatShout += new Cat.CatShoutEventHandler(mouse2.Run);
cat.Shout();
Console.Readkey();

那么事件里的(object sender,EventArgs e)里的两个参数做什么用?
我们增加一个类CatShoutEventArgs,让它继承EventArgs(包含事件数据的类的基类),这个子类的属性Name,就是猫叫事件触发,需要传递Cat对象的名字

Cat类中可以改这段:
public delegate void CatShoutEventHandler(object sender,CatShoutEventArgs args);
在Shout()做修改:
if (CatShout != null)
{
CatShoutEventArgs e = new ...();
e.Name = this.name;
CatShout(this,e); //将发送通知的自己以及需要的数据传递过去

Mouse类中改为:
Run( object sender, CatShoutEventArgs args)
{
//老猫 + args.Name + 老鼠名字 + 快跑
}
}
匿名用户
2012-02-06
展开全部
C#中的委托类似C语言中的指针函数
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
蟀哥葫芦娃
2012-02-06 · TA获得超过194个赞
知道答主
回答量:118
采纳率:0%
帮助的人:48.8万
展开全部
委托像根绳子,
你可以把东西绑上去,也可以结下了。
当你拉这个绳子的时候就带动绳子上的东西。

委托是引用类型。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
LifeRushing
2012-02-07 · TA获得超过786个赞
知道小有建树答主
回答量:861
采纳率:0%
帮助的人:501万
展开全部
自己去msdn看例子,然后自己动手写这样才能理解深刻
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友540dd29
2012-02-08
知道答主
回答量:19
采纳率:0%
帮助的人:8.9万
展开全部
委托
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式