在以下代码中,ptrcall
指向...
obj.callMe
和obj1.callMe
在堆上的2个位置;或... 到其中包含方法obj.callMe
,obj1.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;
}
答案 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()将它们转换为指针。