【问题标题】:Delegate inherited methods explanation委托继承方法解释
【发布时间】:2014-10-16 12:10:19
【问题描述】:

BeginInvoke、Invoke、EndInvoke 方法从何而来?

我去了 MulticastDelegate 和 Delegate,它们不包含任何方法声明。当然我知道这个方法的签名取决于委托声明。但我无法理解它是如何工作的。

这里有什么John Skeet says 的介绍:

您创建的任何委托类型都具有从其父级继承的成员 类型,一个带有 object 和 IntPtr 参数的构造函数和三个 额外方法:Invoke、BeginInvoke 和 EndInvoke。我们会回到 构造函数在一分钟内。方法不能继承自 任何东西,因为签名因签名而异 委托被声明为。使用上面的示例代码,第一个 委托有以下方法

我不是以英语为母语的人,我有点困惑

您创建的任何委托类型都具有从其父级继承的成员

然后

方法不能继承自 任何东西

请解释它是如何工作的。

【问题讨论】:

    标签: c# delegates


    【解决方案1】:

    当编译器处理 C# 委托类型时,它自动生成一个从 System.MulticastDelegate 派生的密封类。

    sealed class Add : System.MulticastDelegate
    {
       public int Invoke(int x, int y);
       public IAsyncResult BeginInvoke(int x, int y, AsyncCallback cb, object state);
       public int EndInvoke(IAsyncResult result);
    }
    

    QuiteCode

    【讨论】:

      【解决方案2】:

      Delegates 是特殊类型,这句话可能意味着您不能手动从 DelegateMulticastDelegate 类继承,因为它们是特殊类。所以 C# 编译器创建的类型继承自 MulticastDelegate并根据delegate类型的签名自动声明这些方法。

      或者可能,这意味着由于委托类型更改了这些方法的签名,它们不是继承的,而是由编译器从头开始创建的,具体取决于委托的类型。(在重读,这更有意义)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-12
        • 2017-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-18
        相关资源
        最近更新 更多