Delegate類提供了一個變參接口DynamicInvoke(params object[] args),可以在委托的具體類型不可知的情況下通過反射來進行委托調用。很方便,但由於變參,而且使用了反射,對性能有極大的影響。 設計實驗: 定義一個委托(委托實例函數的內容為空,這個實驗僅為檢驗調用開銷,所以去掉了函數體,以避免額外干擾),對這個委托以不同的方式調用8×1024×1024次。 方案1——在明確委托類型的情況下直接調用委托 方案2——事先用一個Delegate變量承接委托實例,然後通過Delegate的DynamicInvoke方法調用委托 方案3——事先從委托中取出要調用的MethodInfo,然後通過MethodInfo的Invoke方法來調用委托 結果:方案1 約70ms,方案2 約8500ms ,方案3 約7500ms 很明顯,在確定委托類型的情況下調用委托,就只有一次函數調用的開銷,而通過Delegate類的DynamicInvoke反射調用委托就有了太多太多額外開銷,事先獲取委托的MethodInfo可以減少DynamicInvoke查找方法的那部分開銷,但是同確定類型時的委托調用效率還是無法相比。另外方案3中在調用MethodInfo的Invoke方法前還做了一次參數到object[]數組的轉化。因為Invoke方法只接受object[]參數,把這一步省掉的話,方案3的消耗可以降到6500ms左右,有好轉,但不多。 所以,在能夠確定委托類型的情況還是不要貪圖方便使用Delegate的DynamicInvoke來代替正常的委托調用。