1. C#的委托等同于C++的函数指针 。可以 从 C++函数指针反过来理解C#委托。
2. 委托应用于“同步调用”的场景,如一个有声阅读器,打开记事本(1)并开始阅读(2),这是两个方法,但这时,我想
调用打开的方法时,同时调阅读,这时候委托就来了,把阅读这个方法作为参数传给“打开记事本”的方法。
2. 委托应用于“同步调用”的场景,如一个有声阅读器,打开记事本(1)并开始阅读(2),这是两个方法,但这时,我想
调用打开的方法时,同时调阅读,这时候委托就来了,把阅读这个方法作为参数传给“打开记事本”的方法。
与一般的用法有什么区别,
reader.open();
reader.read();
顺序执行不是一样的吗?
{
InitializeComponent(); //如果要引发Click事件,可以调用EventHandler委托,并传递所有与事件有关的参数(sender,e)。
this.Click += new EventHandler(Form1_Click);
} void Form1_Click(object sender, EventArgs e)
{
throw new NotImplementedException();
}
委托就是对一个方法映射,把方法名当参数来传递,类似JS中的在某个function的参数中把另一个function的名称当参数来传递。//定义委托原型
delegate void UpdateHandler(int id);
//定义符合委托原型的方法UpdateMember
void UpdateMember(int id)
{
//更新用户逻辑
}
//定义符合委托原型的方法DeleteMember
void DeleteMember(int id)
{
//删除用户逻辑
}如何使用呢,如下:
//实例化委托对象,再构造函数中把方法名当参数来传递。
UpdateHandler handler = new UpdateHandler(UpdateMember);
//执行委托对象
handler(某个用户id);
handler(某个用户id)就等价于
UpdateMember(某个用户id)也可以连接多个相同签名的方法,组成一个委托链,当调用委托对象时,链上的方法,按映射的顺序一次被执行。如何使用呢,如下:
UpdateHandler handler = new UpdateHandler(UpdateMember);
handler += DeleteMember;
handler(某个用户id);
handler(某个用户id)就等价于
UpdateMember(某个用户id)
DeleteMember(某个用户id)事件的话,看看设计模式中的观察者模式。
被观察对象中维护了一个观察者列表,这些观察者会对被观察者某个“动作”,即事件,做出各自不同的反映。
常见的例子如下:
某一场景下有主人,猫,狗3个对象。
当主人“打开门”后,猫“跑开了”,狗“叫了”。
整个过程中,主人就是被观察对象,猫和狗都是观察者。
一旦主人触发“打开门”这个事件的话,猫狗做出不同的反映,猫“跑开了”,狗“叫了”。
代码如下:
public class Host
{
//定义委托原型
public delegate void OpenDoorEventHandler();
//定义委托类型的事件
public event GoHomeEventHandler OpenDoor;
//定义内部一个方法,在这个方法内判断,OpenDoor事件是否被其他对象注册,一旦注册了,则调用执行事件。
protected void OnOpenDoor()
{
if(OpenDoor!=null)
{
OpenDoor();
}
}
public void GoHome()
{
OnOpenDoor();
}
}
public class Cat
{
public void Run()
{
//猫跑了
}
}
public class Dog
{
public void Bark()
{
//狗叫了
}
}
如何使用如下:
Host 主人 =new Host();
Cat 猫 = new Cat();
Dog 狗 = new Dog();主人.OpenDoor += new 主人.OpenDoorEventHandler(猫.Run);
主人.OpenDoor += new 主人.OpenDoorEventHandler(狗.Back);主人.GoHome就等价于
猫.Run();
狗.Back();当被观察者,做出某一特定“动作”(被观察者的特定“动作”,注册了N个不同对象的不同反映),观察者对这个特定“动作”做出不懂的反映。
很多ASP.NET程序员,觉得拖控件被人家看不起,还没弄懂委托和事件,就直接转MVC,有点可惜了。
http://www.cnblogs.com/insus/tag/delegate/