在给委托添加方法的时候(假设添加了3个方法),通过调用委托,可以相继执行这三个方法。而且它们执行的顺序是先添加到委托的方法先被调用。因此我猜测系统在存储的时候,是采用队列的存储结构。现在问题来了,虽然我这样猜想它的内部机理,但是这毕竟是我的猜想,没有得到验证。请问各位大侠,我应该怎么通过VS的工具(例如ildasm.exe)或者其他一些行之有效,又具有一般性的方法来验证或者推翻我的想法呢?(注:我只想知道各位前辈在遇到问题之后,是如何通过已有的工具来解决问题的,而不是仅仅想知道问题的最终结果)
调试欢乐多
a+=this.M2;
a+=this.M3;void M1(){}
void M2(){}
void M3(){}//
a.Invoke(); //这时 会按栈的形态先进后出的顺序依次执行a加进来的3个方法,M3,M2,M1可见这是个栈的结构,进一步了解可以查看所有委托的基类 : System.Delegate 这个类,
我在.Net2.0上运行结果是M1,M2,M3。我可以相信你是粗心出错,建议下次要注意。
从方法论上讲,作试验是对的。不过,如果是主观臆造试验结果来支持个人假设就不对了。vrhero强调看MSDN,我也赞成。
有时候用ildasm或refletor看内部实现细节是可以增强理解。不过基于内部实现来编程却不是好的主意。
对那些MSDN上已公开的参考,微软有责任保持一致和兼容性。但对封装了的具体实现细节,却可以进行改变。如果你的程序依赖于多播委托被调用的顺序,我的建议是看MSDN的参考进行确认。如果MSDN参考没讲或非常模糊,可以自己写一个委托链(就几行或几十行),来保证执行顺序。
就是说, 今天可能这样, 明天可能那样,不能假定某种顺序而采取对于措施.
以上MSDN原内容。
System.Delegate类,它有自身的成员,其中有一个Method属性,这个属性表示要调用的方法,你再看看这个属性是什么类型的,顺藤摸瓜的看看此类型都实现了那些接口,这些接口都定义了哪些成员,这样一路大概看看。”
MulticastDelegate 是一个特殊类。编译器和其他工具可以从此类派生,但是您不能显式地从此类进行派生。Delegate 类也是如此。MulticastDelegate 拥有一个带有链接的委托列表,该列表称为调用列表,它包含一个或多个元素。在调用多路广播委托时,将按照调用列表中的委托出现的顺序来同步调用这些委托。如果在该列表的执行过程中发生错误,则会引发异常。“
再看看System.MulticastDelegate 这个类,既然是同步调用,你搜下关于 同步 的资料看看,不多说了!