gpt4 book ai didi

c# - 委托(delegate)指向什么?

转载 作者:可可西里 更新时间:2023-11-01 08:42:37 26 4
gpt4 key购买 nike

我读到引用类型包含对可能存储在托管堆上的实际对象的引用。当一个方法被“分配”给一个委托(delegate)引用变量时,引用指向什么内存?这个内存块和实际的功能代码有什么关系?

最佳答案

让我们拆开一个简单的例子:

using System;
class Program
{
delegate bool MyFilter(int x);

bool IsOdd(int x)
{
return x % 2 == 1;
}

static void Main()
{
MyFilter f = new Program().IsOdd;
Console.WriteLine(f(5));
}
}

编译器做什么?让我们从这一行开始:

delegate bool MyFilter(int x);

编译器生成一个看起来像这样的类型:

class MyFilter : MulticastDelegate
{
public MyFilter(Object thisRef, IntPtr method);
public bool Invoke(int x);
// BeginInvoke(), EndInvoke() - Let's ignore those
}

MyFilter 类型有一个接受两个参数的构造函数:要调用的方法体的 IntPtr 和调用此方法的对象。 MyFilter 类型的 Invoke() 方法调用实际委托(delegate)。

现在,让我们看看 Main() 方法中发生了什么。编译器会像这样重写它:

    static void Main()
{
MyFilter f = new MyFilter(new Program(), addressof(Program.IsOdd));
Console.WriteLine(f.Invoke(5));
}

当然,addressof 并不是一个实际的C# 运算符,但你可以想象它返回传入方法的主体地址。此外,我没有讨论与委托(delegate)相关的各种其他主题,例如链接(这是 MulticastDelegate 基类提供的功能),但希望我已经解决了您的问题。

总而言之,委托(delegate)引用指向一个对象,该对象实现了与委托(delegate)签名相匹配的 Invoke 方法。该对象跟踪指向需要调用的方法的指针,以及调用该方法的目标对象(除非该方法是静态的)。

关于c# - 委托(delegate)指向什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9441022/

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