委托相当于指定一些代码在特定的时间执行,那时你已经无法更改要执行的代码,委托的实质是间接完成某种操作。
委托就是c#中的闭包(函数对象)啊。闭包就是一段代码加上所需的上下文,你可以理解为闭包用于储存一段代码逻辑。闭包这个概念是共性的,但是反映到具体的编程语言里,形态就五花八门了。比如java里的函数式接口(functional interface)就是闭包,c++的std::function
也是闭包。
根据支持闭包的差异,可以将语言分为两种,一些语言中函数是第一等的,也就是说所有函数都是闭包,比如python和javascript,而另外一些语言,比如c#、java、c++,普通函数不是闭包,闭包用特定的类表示。
一. 简单委托的构成:
1.声明委托类型;
2.必须有一个方法包含了要执行的代码;
3.必须创建一个委托实例;(创建代码与该方法是否是静态方法有关)
4.必须调用(invoke)委托实例;
二 . 最终的垃圾:必须注意,假如委托实例本身不能被回收,委托实例会阻止它的目标被作为垃圾回收。这可能造成明显的内存泄漏,尤其是假如某短命的对象调用了一个长命的对象,并用它自身作为目标。长命对象间接容纳了短命对象的一个引用,延长了短命对象的寿命。
三. 委托是不易变的:创建了委托实例后,有关他的一切就不能改变。Delegate。Combine和String。Concat很像,都是合并现有的实例来形成一个新实例,同时根本不更改原始对象,注意,如果试图将null和委托实例合并到一起,null将被视为带有空调列表的一个委托。
四. 委托实例实际有一个操作列表与之关联,这称为委托实例的调用列表,System.Delegate类型的静态方法Combine和Remove负责创建新的委托实例。其中Combine负责将两个委托实例的调用列表连接到一起,而Remove负责从一个委托实例中删除另一个实例的调用列表。(+=,-=),调用委托实例时,它的所有操作都顺序执行,如果委托的签名具有一个非void的返回类型,则Invoke的返回值是最后一个操作的返回值。
五. 事件不是委托实例----只是成对的add/remove方法(类似于属性的取值/赋值方法)。