在给委托添加方法的时候(假设添加了3个方法),通过调用委托,可以相继执行这三个方法。而且它们执行的顺序是先添加到委托的方法先被调用。因此我猜测系统在存储的时候,是采用队列的存储结构。现在问题来了,虽然我这样猜想它的内部机理,但是这毕竟是我的猜想,没有得到验证。请问各位大侠,我应该怎么通过VS的工具(例如ildasm.exe)或者其他一些行之有效,又具有一般性的方法来验证或者推翻我的想法呢?(注:我只想知道各位前辈在遇到问题之后,是如何通过已有的工具来解决问题的,而不是仅仅想知道问题的最终结果)

解决方案 »

  1.   

    不用使用其它什么工具了吧 首先应该用代码 来测试 考查,这样比较有意义按你说的+3个方法吧比如 这样Action a;a+=this.M1;
    a+=this.M2;
    a+=this.M3;void M1(){}
    void M2(){}
    void M3(){}//
    a.Invoke(); //这时 会按栈的形态先进后出的顺序依次执行a加进来的3个方法,M3,M2,M1可见这是个栈的结构,进一步了解可以查看所有委托的基类 : System.Delegate 这个类,
      

  2.   

    不知道去看MSDN吗...理论都清清楚楚的还用得着验证?非要看就用ildasm也是清清楚楚的...http://msdn.microsoft.com/zh-cn/library/system.multicastdelegate(VS.95).aspx
      

  3.   


    我在.Net2.0上运行结果是M1,M2,M3。我可以相信你是粗心出错,建议下次要注意。
    从方法论上讲,作试验是对的。不过,如果是主观臆造试验结果来支持个人假设就不对了。vrhero强调看MSDN,我也赞成。
    有时候用ildasm或refletor看内部实现细节是可以增强理解。不过基于内部实现来编程却不是好的主意。
    对那些MSDN上已公开的参考,微软有责任保持一致和兼容性。但对封装了的具体实现细节,却可以进行改变。如果你的程序依赖于多播委托被调用的顺序,我的建议是看MSDN的参考进行确认。如果MSDN参考没讲或非常模糊,可以自己写一个委托链(就几行或几十行),来保证执行顺序。
      

  4.   

    谢谢各位地耐心回答,其实我地初衷是想通过一些工具的使用来理解.net地运行原理。加深对.net机制地理解。很多时候我在MSDN上看到地东西都让人不大容易理解,而且更多时候又是找不到解决方案地。因此,此时想通过其他地途径,自己来解决问题(而不是一遇问题就上CSDN)。
      

  5.   

    Multi cast delegate 的 调用顺序是无保证
    就是说, 今天可能这样, 明天可能那样,不能假定某种顺序而采取对于措施.
      

  6.   

    MSDN上的确说的够明确了,那只是标准答案!”Delegate 类是委托类型的基类。然而,只有系统和编译器可以显式地从 Delegate 类或 MulticastDelegate 类派生。此外,还不允许从委托类型派生新类型。Delegate 类不是委托类型,该类用于派生委托类型。“--
    以上MSDN原内容。

    System.Delegate类,它有自身的成员,其中有一个Method属性,这个属性表示要调用的方法,你再看看这个属性是什么类型的,顺藤摸瓜的看看此类型都实现了那些接口,这些接口都定义了哪些成员,这样一路大概看看。
    MulticastDelegate 是一个特殊类。编译器和其他工具可以从此类派生,但是您不能显式地从此类进行派生。Delegate 类也是如此。MulticastDelegate 拥有一个带有链接的委托列表,该列表称为调用列表,它包含一个或多个元素。在调用多路广播委托时,将按照调用列表中的委托出现的顺序来同步调用这些委托。如果在该列表的执行过程中发生错误,则会引发异常。“

    再看看System.MulticastDelegate 这个类,既然是同步调用,你搜下关于 同步 的资料看看,不多说了!
      

  7.   

    支持!记得在<.NET 框架设计>里就是这么说的,好像还带了个验证代码的!