指向C#委托中方法的指针

时间:2011-08-06 22:50:15

标签: c# delegates

在以下代码中,ptrcall指向...

  • 使用方法obj.callMeobj1.callMe在堆上的2个位置;或...
  • 到其中包含方法obj.callMeobj1.callMe的1个地方?

    public delegate void CallEveryOne();
    
    private void Form1_Load(object sender, EventArgs e)
    {
    
    public CallEveryOne ptrcall=null;
    
    public Form2 obj = new Form2();
    public Form3 obj1 = new Form3();
    
        obj.Show();
        obj1.Show();
    
        ptrcall += obj.CallMe;
        ptrcall += obj1.CallMe;
    } 
    

2 个答案:

答案 0 :(得分:3)

ptrcall,就像.NET 2.0以后的所有代表一样,是一个多播委托。也就是说,它保留了自己引用的内部方法列表。 MSDN在MulticastDelegate上有以下说法:

  

表示多播委托;也就是说,一个委托可以在其调用列表中包含多个元素(由我添加强调。)

因此,在您的术语中,答案很可能是ptrcall指向堆上的2个位置。

但为什么这个实现细节很重要?


P.S。:你可以致电ptrcall.GetInvocationList(),看看你得到了什么。我只向你推荐这个,让你更好地了解代表们;除非你真的必须,否则不要在生产代码中执行此操作。

答案 1 :(得分:0)

我想你想知道这与非托管系数的互操作? Ptrcall存储对CallEveryOne类型的对象实例的引用(派生自MulticastDelegate类型)。此对象包含(以及其他内容)内部数组,其中包含有关添加到此委托的每个方法的信息,但您不打算直接使用它。如果需要指向订阅方法的指针,请使用ptrcall.GetInvocationList()获取方法列表,使用System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate()将它们转换为指针。

相关问题