.NET单一与多播委托

use*_*673 1 c# delegates

我已经深入阅读了一些关于代理的内容,一个方法的委托可能与多播委托不同,这让人感到困惑.但是,通过反射,你可以清楚地看到,即使只有一个方法,委托确实是从一个对象派生出来的MulticastDelegate,而不是立即派生出来的Delegate.

class Program 
{
    public delegate void MyDelegate();

    static void SomeMethod()
    {
    }

    static void Main(string[] args)
    {
        MyDelegate del = null;
        del = new MyDelegate(SomeMethod);
        Console.WriteLine(del.GetType().BaseType.Name);            
        Console.ReadKey();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:MulticastDelegate

我意识到a MulticastDelegate包含一个Delegate对象的调用列表.我想知道是否有可能Delegate直接创建单个,如果这样做有任何好处,除了单独调用GetInvocationList()和提取Delegate对象.

the*_*oop 6

并不是的.所有.NET代理都派生自MulticastDelegate.首次编写.NET时,单个和多播之间最初存在差异,但在发布之前已将此区别删除.但是,基础类型没有合并为一个.

你不能Delegate直接从C#派生.你可能能够在原始的IL中,但并没有太多的意义,因为MulticastDelegate像所有意图和目的的单一代表一样操作.

  • 您可以通过指出Delegate是一个抽象类来澄清它.所以你永远不能创建它的实例. (3认同)