看Andrew Troelsen写的 《Pro C# and .net 3.5 platform》这本书有段时间了。收获挺多的。对C#语法和.net底层的机制有了比以前更多的了解。前段看了事件,委托及.net新增的一些新特性,如:lambda操作符,隐性数据类型,自动属性,扩展方法,Linq等;这段时间一直在看程序集的相关知识,因为之前在学校里学习我一直都是只看书,没有养成写读书笔记的习惯,所以,我就一拖再托,托到现在才决定把这段时间所学的知识(主要是委托,事件)写出来。

   首先来说委托,我个人目前的理解,就是委托就相当于C/C++的指针一样,我们可以通过委托来指向某个方法函数,但是委托和指针的不同之处在于委托可以指向多个方法,而且委托可以指向静态和非静态的成员,而指针则不行;而事件则起着关联的作用,一个对象通过触发某个事件来调用另外一个对象里的方法;

 一. 委托:

    1. 包含了它所指向的函数的地址;

    2. 包含了它所指向的函数的参数个数及类型;

    3. 包含了它所指向的函数的返回类型;

    定义一个委托:

    public  delegate  ReturnType  DelegateName(Type  par,...)

    委托可以以同步或者异步的方式调用它所指向的方法;

     委托经过编译之后生成的CIL中最主要的几个函数:

    1. Invoke():用同步的方法激发每一个被委托所指向的方法;

    2. BeginInvoke(),EndInvoke():异步的激发委托所指向的方法;

    委托经过编译之后的CIL实例: 

     Sealed class DelegateName:System.MulticastDelegate

     {

            Public DelegateName(object target,uint functionAddress);

            Public ReturnType Invoke(Type Par,…);

            Public IAsyncResult BeginInvoke(Type Par,      …,AsyncCallback cb,object state);

            Public ReturnType EndInvoke([如果委托的参数列表中有refout类型的参数则在这里会有,否则该处无参数],IAsyncResult result);

      }

 

   委托的类型安全的对象,所谓类型安全就是CLR可以根据变量的值知道的类型;

  

   委托对象所具有的一些属性方法:

   1. Method():返回委托所指向的静态方法的所有信息;

   2. Target:用于对象(静态成员不允许),返回定义了委托所指向的方法的对象;

   3. Combine():

   4. GetInvocationList():返回委托指向的所有方法;

   5. Remove():删除委托所指向的一个方法;

   6. RemoveAll():删除委托所指向的所有方法;

 

   我们一般把委托声明为私有的;

   正如在上面所说的,委托可以指向多个方法,当我们需要给委托增加方法时,我们可以使用+=操作符,当我们需要从委托所指向的方法列表中删除一个方法时,我们可以使用-=操作符;

   委托的一些用途:

   1. 委托可以用作函数参数进行传递:

public delegate void DelegateName(Type Par,…);

FunctionName(new DelegateName(Function_Pointed_To));

 2. 委托还可以用来指向返回类型为自定义类型的方法;

Public delegate ClassName ObtainCarDelegate();//声明委托

Public static ClassName GetCarInfo();//委托将指向的方法

ObtainCarDelegate OcDelegate=new ObtainCarDelegate(GetCarInfo);//将委托指向返回类型相同,参数类型相同的方法;

如果两个类之间有继承关系的话,比如A是B的子类,那么我们不需要定义两个返回值不同(A)的委托,只用定义一个返回类型为父类的委托;(这句话我不是很懂,也有可能我理解错了,还望有谁可以帮帮我^^);

委托的返回类型不仅可以是具体的返回类型,也是不具体的,即范型委托:

public delegate void DelegateName<T>(T Par,...);

范型委托可以用于返回值不同,参数不同的方法,实现了类型安全;

二. 事件

事件起关联的作用,一个对象可以通过触发事件来调用另外一个对象里的方法;

事件的定义:

public delegate DelegateName<T>(T Par,...);

public event DelegateName EventName;

事件的注册:

Object1.EventName+=new Class1.DelegateName(EventHandler);//EventHandler即为响应事件的方法;

 

匿名方法:

实例:

     c1.Exploded += delegate(object sender, CarEventArgs e) {

          Console.WriteLine("Fatal Message from Car: {0}", e.msg);

          };

   匿名方法的一个好处就是匿名方法可以利用匿名方法所处的域的局部变量,如果是使用的“实名方法”,那么就不能使用里面的局部变量了;

   另:事件的注册除了像上面列出来的方式进行,也可以直接将方法赋给事件,只要该方法的返回类型和参数类型和委托的相同就ok了;

   如:

   Object1.EventName+=EventHandler;

 

三.  Lambda运算符(=>)

   Lambd运算符相当于一个简化的匿名方法和委托;

   Lambda定义:

   ArgumentsToProcess => StatementsToProcess Them;

   实例:

   public delegate Type DelegateName(Type Par,...);//定义委托

   public event DelegateName EventName;//定义事件

   public Type FunctionToCall(Type Par,...);//响应事件的方法

   //传统的方法,通过委托来注册事件

   EventName += new DelegateName(FuctionToCall);

   //通过匿名方法来注册事件

   EventName += delegate(Type Par,...){

                       StatementsToProcess Them;

                        };

   //通过Lambda运算符来注册事件

   EventName += {(Type Par,...) =>

                         {StatementsToProcess Them;}

                         };

    我学习.net不久,完全就是一个菜鸟,对书上的很多知识的理解都不是很充分,如果我有哪里理解不对或者错误的,还请大家指正,多多指教。

我以后会陆续把我的读书笔记贴出来,大家一起学习,一起进步;

路漫漫其修远兮,吾将上下而求索!

Wish~