前几天,忘记在哪个论坛上了,看见大家在讨论 “委托和事件”,本来兴高采烈的想加入其中,但是仔细一思考,“委托”到底是什么?它到底能实现什么要的功能呢?
说实话,现在回想一下 在使用c#写一些小程序的时候,貌似没有一次 很自然的使用 委托……失败吧,一个强大的功能就这样自废武功了~刘备不仁德,孙权不制衡,周泰不不屈之类的巴拉巴拉……
可能有些朋友会说,我们在使用 “事件”这个概念的时候,就已经在使用委托了,的确,委托就是用作应用程序接收到消息时封装事件的方式。但是,根据c#的设计原则,我们无需理解底层的委托就可以使用它们……事件可以用作理解委托最形象最普遍的一个例子,但是我个人觉得,委托可以用更强大的应用,于是前提就是,我需要重读“委托”……
当我们第一次接触到这个概念的时候,与其去问 “委托是什么?” 不如 知道 “委托能干什么?”
一个经典的,并且简练的说法是 “当我们需要把 方法 传递 给 其他方法的时候,我们就需要使用委托”,一个形象的实例~
int function(operation op , int digit_1 , int digit_2)
向方法 function 传递 两个操作数,以此同时,又传递一个 处理这两个操作数的方式……,或者加,或者减……
作为C/C++的使用者,函数指针的概念应该不会陌生,那么就从这里出发:
在C/C++中,我们传递函数指针的时候,仅仅传递了一个函数的地址,好吧~既然是地址,就没有任何一个“证据”来证明 它是一个处理 字符串的函数,处理两个 int的函数,返回一个double的函数,甚至没办法证明它就是一个函数……这样是没有类型安全性的。
另外,在面向对象编程中,方法是很少孤立存在的,通常需要与类的实例(对象)向关联,但是,这种单纯的传递指针的方式,没有考虑这些问题……
于是我们使用委托……
我们甚至可以这样理解 “委托 是 c#中 类型安全的 函数 指针的传递方式,向方法传递方法的方式”
委托可以看做是一个安全的对象类型,他把方法的细节封转在其中,在这里,记录了一些“证据”:它一个方法!它是处理两个int的方法,它是返回string的方法……等等,这个“证据”证明了也限制了它可以封装在其中的 方法,这些“证据”就是传说中的签名……
delegate bool Compare(int x, int y)
return 的 bool ,参数中 的 int x,int y 就是 签名
我个人觉得,只要理解了 委托到底 可以做到哪些事情,就可以从一般层次上理解委托的含义了。至于委托如何定义,如何使用,什么是多播委托,什么是抗变和协变,说明是兰帕达表达式……这些都不是问题。