如何理解c#中的委托

2024-12-01 00:54:11
推荐回答(5个)
回答(1):

委托是对函数的封装,可以当作给方法的特征指定一个名称。而事件则是委托的一种特殊形式,当发生有意义的事情时,事件对象处理通知过程。

最常见的例子就是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 + 老鼠名字 + 快跑
}
}

回答(2):

C#中的委托类似C语言中的指针函数

回答(3):

委托像根绳子,
你可以把东西绑上去,也可以结下了。
当你拉这个绳子的时候就带动绳子上的东西。

委托是引用类型。

回答(4):

自己去msdn看例子,然后自己动手写这样才能理解深刻

回答(5):

委托