深入理解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++中的函数指针不同,委托是面向对象,而且是类型安全的。

把方法作为参数/属性来赋值或传递,事件是委托的一种具体应用,委托可以理解为一种接口,具体的方法实现这个接口,在开发阶段只需要关心委托的定义就可以调用,而不用关心它如何实现的或者在哪里实现的。

 在用线程的时候 直接调用方法或者改变控件的话会出错,但是用委托就可以解决错误,可以实现异步更新.


通常使用的场合包括 设计一个通用的控件 等。

0 0
原创粉丝点击