今天花了一整天的时间研究,不知道为什么一看完委托,现在来回顾一下,居然一点都回忆不起来,所以我再重头看下,并且把它写成文章方便以后查看。
定义:委托是一个类型(专门声明可以代表替他方法调用的变量)
语法:[修饰符] delegate 返回类型 委托名 (参数列表);
public delegate void AgencySaleCar();
委托最大的特点就是可以一般化的编程,即使在方法不存在的情况下也可以使用
if(委托变量 != null) {
委托变量();
}
委托与函数指针的区别:
委托安全、委托是较复杂的数据结构可以实现"委托链(多播委托)"
指针,就是地址
其实在我看来,函数指针就是地址,地址可以任意赋值给某个指针变量,所以不安全,而委托是较为复杂的数据结构实现的,委托是一个类型,所以有严格的类型规范,不能随便赋值。
匿名方法demo:
public delegate void MyMethod(string s);//定义一个委托类型
//匿名方法
MyMethod myM1 = delegate(string s) { };
将匿名方法再一次简化,得到Lambda表达式
myM1 = (s) => 语句;
// => 读作 goes to
// 语句如果是一句话,可以省略花括号和return
// ()中表示参数,如果不会引起冲突,可以省略类型
多播委托(委托链,委托的组合)
委托都继承自System.MulticastDelegate而System.MulticastDelegate又继承自System.Delegate。
委托类(System.MulticastDelegate)的3个重要成员:
internal IntPtr _methodPtr; // 继承自System.Delegate
internal object _target; // 继承自System.Delegate 指向当前方法的指针
private object _invocationList; // 来自System.MulticastDelegate
实际上_invocationList 是一个数组
匿名方法的的危害:在匿名方法中,匿名方法创建了闭包,某些对象生命周期会加长
匿名表达式缺点:匿名方法的优势在于自动形成闭包,而它的缺点也是让程序员“不自觉”地创建了闭包,这会让某些对象的生命周期加长。
在.NET 3.5委托的写法(Lambda表达式):
Lambda表达式的增强在于“语义”, 扩展方法的延迟特性(提高性能,“合并循环”)
参考:老赵 http://www.cnblogs.com/JeffreyZhao/archive/2009/08/07/from-delegate-to-others-2.html