zoukankan      html  css  js  c++  java
  • CLR读书笔记——委托

    协变性和逆变性

    协变性是指方法能返回从委托返回类型派生的一个类型。

    逆变性是指获取的参数可以是委托参数类型的基类。

    举个例子吧,看以下定义的委托,以及方法。

    delegate Object MyCallBack(FileStream fs);
    

     以下方法可以绑定该委托

    String SomeMethod(Stream s);
    

     在该方法中返回类型String是Object的派生子类,这种协变性是允许的。

    方法参数Stream是委托参数FileStream的基类,这种逆变性也是允许的。

    但是要注意的是:协变性与逆变性只能应用于引用类型,不能应用于值类型和void,所以,以下方法不能绑定到MyCallBack委托。

    Int32 SomeOtherMethod(Stream s);
    

    我们再来定义一个委托:

    internal delegate void Feedback(Int32 value)
    

     你一定很想了解内部编译器生成了什么吧?编译器会定义如下一个完整的类。

     1 internal class FeedBack:System.MulticastDelegate
     2 {
     3      public FeedBack(Object object,InPtr method);
     4 
     5      public virtual void Invoke(Int32 value);
     6 
     7      public virtual IAsyncResult BeginInvoke(Int32 value,AsyncCallback callback,Object object);
     8 
     9     public virtual EndInvoke(IAsyncResult result);  
    10 
    11 }

    所有委托类型均派生自MulticastDelegate这个类型,后者又派生自Object。

    由于所有委托类型均派生自MulticastDelegate,所以继承了MulticastDelegate的方法、字段和属性。

    其中三个属性我们需要注意,非常重要。

    _target:      这是一个Object类型的字段,当委托包装的是一个静态方法时,值为null,当委托包装一个实例方法时,这个字段引用的是回掉方法要操作的对象,换言之,这个字段       指出要传给实例方法的隐式参数this的值。通俗来说,就是当委托包装为一个实例的时候,这个字段保存的是实例方法的对象。

    _methodPtr: 一个内部的整数值,CLR用它来标识要回调的方法

    _invocationList: 该字段通常为Null,构造一个委托链时,它可以引用一个委托数组。

     

  • 相关阅读:
    Sample XPS Documents Download
    触发器中的inserted表和deleted表
    Using freewheel.labs.autodesk.com to auto generate preview images of DWF files on your web site
    解除SQL对组件"Ad Hoc Distributed Queries"的"STATEMENT'OpenRowset OpenDatasource"的访问
    读写xps
    XPS文件,在Windows XP下的打开查看阅读和打印方法。
    Learning to Reference Inserted and Deleted Tables
    Get value from updated, inserted and deleted
    Reinstall Microsoft Helper Viewer
    如何查找文件的IFilter
  • 原文地址:https://www.cnblogs.com/yangda/p/3362260.html
Copyright © 2011-2022 走看看