深入理解C#中的委托
来源:互联网 发布:java ssh 编辑:程序博客网 时间:2024/05/17 23:46
委托干的活,大致上就是C中函数指针忙活的东西,但使用起来比函数指针更安全和系统。
这里先推荐一个大神写的介绍委托的博客。波哥2010大白话委托
写的特好,透彻清晰。
本文一部分是从网上找到的资源,为了今后方便回顾,特地整合在本篇博客。
下面先简单介绍下委托
委托就是对一个方法映射,把方法名当参数来传递,类似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); //id这个参数会传递给实际工作的方法,在事件+委托中,规范的参数是sender和e
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个不同对象的不同反映),观察者对这个特定“动作”做出不懂的反映。
为什么要使用委托
至于为什么要使用委托呢,因为解耦。试想如果不使用委托,为了达到同样的目的,必然要将被观察者和观察者写到同一个类中,两者高度耦合。
委托的好处很多,不一而足:
一 你可以先看设计模式里的观察者模式,在没有委托这个模式的还是存在观察者和被观察者之间的耦合,而委托可以是两者更大的解除耦合。在面向对象编程能接触耦合就是最大的好处,委托也可以说是观察者模式,这个模式的好处也可以说是委托的好处,它能使一个对象状态的改变立即通知其他对象,而这个对象和其它的对象是完全分离的,就是互相不知道对方的存在,这样在程序规模变大的情况下更加容易维护(每一个对象的修改不涉及另一个对象),更加容易扩展(理由同上),也更加灵活。一句话就是达到解耦的目的。
二 得益于解耦,使用委托使程序员可以将方法引用封装在委托对象内,将所引用方法传递给调用委托对象的代码,而不必在编译时知道将调用哪个方法。与C或C++中的函数指针不同,委托是面向对象,而且是类型安全的。
把方法作为参数/属性来赋值或传递,事件是委托的一种具体应用,委托可以理解为一种接口,具体的方法实现这个接口,在开发阶段只需要关心委托的定义就可以调用,而不用关心它如何实现的或者在哪里实现的。
三 在用线程的时候 直接调用方法或者改变控件的话会出错,但是用委托就可以解决错误,可以实现异步更新.
通常使用的场合包括 设计一个通用的控件 等。
- 深入理解c#中的委托
- 深入理解C#中的委托
- 深入理解C#中的委托和事件
- 深入理解C#中的委托和事件
- 深入理解C#中的委托和事件:委托的定义
- 深入理解C#编程中的组件-事件-委托
- 深入理解C#编程中的组件-事件-委托
- 深入理解C#编程中的组件-事件-委托
- 深入理解C#编程中的组件-事件-委托
- 理解C#中的委托[翻译]
- 理解C#中的委托(Deligate)
- 举例理解C#中的委托
- 深入理解C#委托的实质
- 深入理解C#委托的实质
- 深入理解C#委托及原理
- 深入理解C#委托及原理
- 深入理解C#委托及原理
- 深入理解C#委托的实质
- VBS实现发送邮件
- 梯度和Sobel导数
- grunt构建&文件合并&压缩
- 【插件动态加载方案】
- Linux 1
- 深入理解C#中的委托
- eclipse Javaee 版本正常引入servlet类 并且开发web项目
- java.util.Arrays类
- LeedCode 之 AddBinary
- 机器学习中模型优化不得不思考的几个问题
- centos6.5 rpm 安装mysql5.6
- Linux 安装 utf8mb4格式的mysql
- Toast工具,强大的吐司,能够连续弹的吐司。
- 子级元素设的margin-top会超出父级的范围