委托

今天花了一整天的时间研究,不知道为什么一看完委托,现在来回顾一下,居然一点都回忆不起来,所以我再重头看下,并且把它写成文章方便以后查看。

 

定义:委托是一个类型(专门声明可以代表替他方法调用的变量)

语法:[修饰符] 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.MulticastDelegateSystem.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

原文地址:https://www.cnblogs.com/dongqinglove/p/3546447.html