gpt4 book ai didi

c# - 内部如何生成委托(delegate)类型的方法?

转载 作者:太空宇宙 更新时间:2023-11-03 19:27:58 25 4
gpt4 key购买 nike

我知道委托(delegate)类型继承自 MulticastDelegate,后者又继承自 Delegate 类。

此外,当我们创建委托(delegate)实例时,它会创建三个具有与委托(delegate)相同签名的方法(Invoke、BeginInvoke、EndInvoke 以及构造函数)。

我无法理解它是如何在内部创建的(具有委托(delegate)类型签名的方法)?

提前致谢。

最佳答案

如果您在 Reflector 或 ILSpy 中查看委托(delegate)类型的 IL,您会发现它看起来像这样:

.class public sealed System.Action extends System.MulticastDelegate
{
.method public hidebysig specialname rtspecialname instance void .ctor(object 'object', native int 'method') runtime managed {}

.method public hidebysig newslot virtual instance void Invoke() runtime managed {}

.method public hidebysig newslot virtual instance class System.IAsyncResult BeginInvoke(class System.AsyncCallback callback, object 'object') runtime managed {}

.method public hidebysig newslot virtual instance void EndInvoke(class System.IAsyncResult result) runtime managed {}
}

即构造函数 (.ctor)、InvokeBeginInvoke/EndInvoke 方法。您还会注意到,这些方法没有实现(方法体为空),并用 runtime 标记。

runtime 关键字向 CLR 指示此方法需要 CLR 本身提供的实现。也就是说,委托(delegate)的实现完全是 CLR 本身内部的魔法。加载委托(delegate)类型时,CLR 注意到它派生自 System.Delegate,注意到 runtime 标志,因此在 CLR 中为该特定类型创建这些方法的实现委托(delegate)类型。

这些实现的实际外观完全取决于您运行它的 CLR(无论是 .NET 平台、Mono 还是其他平台),但很可能直接在 native 代码中。

当编译器编译一个委托(delegate)类型时,它只是创建这些方法 stub 以匹配 CLR 期望的这种模式,并将其保留在那里。委托(delegate)的实际工作方式取决于运行时。

关于c# - 内部如何生成委托(delegate)类型的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7150977/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com