委托的前世今生

学习委托那段时间是我对编程最头疼的几个时间段之一,.net中的委托自从出现以来,就开始了它征服程序员和被程序员征服的历程。直到现在,我依然不敢说自己对委托的认识已经足够清晰,也许它并不很难,可是我觉得它很绕。今天说说委托的前世今生,不知道对学习委托的人有没有用。

委托前世:与指针的各种纠葛

如果说委托是凭空发明的,似乎有点说不过去,因为指针不同意,有些指针认为委托继承了它的一些基因。

都知道C语言中有一种很强大的武器就是指针,指针一个比较大的用处就是允许我们手动操作内存,这一点也是与现今的托管代码高级语言的一个主要区别。变量的内存地址可以存储在相应的指针变量中,同样函数的首地址也可以存储在某个函数指针变量里的。这样我们就可以通过这个函数指针变量来调用其所指向的函数了。

一般情况下很少会直接将函数指针作为函数参数传递,但如果想在一个方法里调用用户传递的函数并通知用户我们进行了某项操作,继而让用户继续他的使用或操作。具体代码可以自己查阅相关的资料,我就不给出了,大学考过C语言以后没怎么写过,我脑中的C已经生锈了。

委托的今生:面向对象时代肩负重任

在我看来(当然也是学习别人的见解),所谓委托就是在面向开发对象领域中,对传递函数作为参数的实现方式,它记录了方法所依附的对象及方法的相关信息。

随着面向对象时代的到来,新的开发方法和模式逐渐的取代了面向过程的开发。对象作为面向对象中开发的基本单位,是数据和操作的组合体,封装了数据和操作。这样的话,很显然我们不能将函数直接作为参数传递了。作为一种新生代的语言,C#除了引入一些新的特性之外,同时也需要兼容一些已经存在的技术。

我们都知道既然方法都依附于某个对象,那么我们就可以定义一个类,来记录方法的相关信息,这样不仅保证了方法的唯一性,同时也提高了代码的安全性。所以在C#中引入了委托,委托是一种定义方法签名的类型。当实例化委托时,可以将其实例与任何具有兼容签名的方法相关联。我们可以通过委托实例调用方法。委托用于将方法作为参数传递给其他方法。事件处理程序就是通过委托调用的方法。您可以创建一个自定义方法,当发生特定事件时某个类就可以调用我们的方法。

简单讲解一下对委任的理解

我看过至少十个委托的讲解版本,每个都有自己的使用习惯,当时觉得委托变化太多端(这可能也是最开始把我弄懵的原因之一吧),现在我简单用代码为初学者解释一下委托吧:

public abstract class Delegate : ICloneable, ISerializable
{
    // 摘要:
    //     初始化一个委托,该委托对指定的类实例调用指定的实例方法。
    //
    // 参数:
    //   target:
    //     类实例,委托对其调用 method。
    //
    //   method:
    //     委托表示的实例方法的名称。
    //
    // 异常:
    //   System.ArgumentNullException:
    //     target 为 null。 - 或 - method 为 null。
    //
    //   System.ArgumentException:
    //     绑定到目标方法时出错。
    protected Delegate(object target, string method);
    //
    // 摘要:
    //     初始化一个委托,该委托从指定的类调用指定的静态方法。
    //
    // 参数:
    //   target:
    //     System.Type,它表示定义 method 的类。
    //
    //   method:
    //     委托表示的静态方法的名称。
    //
    // 异常:
    //   System.ArgumentNullException:
    //     target 为 null。 - 或 - method 为 null。
    //
    //   System.ArgumentException:
    //     target 不是 RuntimeType。请参见反射中的运行库类型。 - 或 - target 表示开放式泛型类型。
    protected Delegate(Type target, string method);

 }

 

一句话说明我对委托的使用感受

在用过了这么多年委托之后,有种特别强烈的感觉:如果C#中没有了委托,它还能做什么?(个人观点,可能有点小偏激,大家不要喷)。

posted @ 2012-06-18 10:31  刘笨笨  阅读(2723)  评论(5编辑  收藏  举报