我正在阅读有关多播委托的内容,并且内存分配的想法阻止了我。 有人可以解释如何完成多播委托的内存分配。(我故意没有添加任何事件让我更容易理解) 在这个计划中:
using System;
delegate int MyDelegate(int a,int b);
namespace DelegateAppl
{
class DelegateTest
{
public static int AddNum(int p,int q)
{
int add = p + q;
return add;
}
public static int MultNum(int p, int q)
{
int mul = p * q;
return mul;
}
static void Main(string[] args)
{
MyDelegate myDel = new MyDelegate(AddNum);
myDel += new MyDelegate(MultNum);
int result = myDel(2, 5);
Console.WriteLine("Value of Num: {0}", result);
Console.ReadKey();
}
}
}
如何分配Mydelegate。它是否具有addNum或MultNum的大小或两者的大小?
MyThoughts - 编译器将为Mydelegate分配一些内存(我不知道多少)并将其存储在缓存中。然后将根据方法(ADD)分配内存,然后删除和然后再通过委托调用时按照乘法方法再分配内存。 我理解正确吗?
答案 0 :(得分:1)
委托被编译到一个私有的密封类(包含类),这是隐藏的 - 它是在编译期间生成的。每次初始化委托时,例如MyDelegate myDel = new MyDelegate(AddNum);
,您实际上是在初始化该隐藏类的实例。该类还包含一个名为_invocationList
的字段,类型为System.Object,用于引用另一个委托,并通过Delegate.Combine(Delegate that, Delegate other)
分配,这是写{{1}时真正发生的事情。 }。从那里你可以弄清楚如何分配内存 - 它是常规对象的实例化。