.net中包括两个Delegate类,一个是Delegate,一个是MulticastDelegate,其中后者继承自前者,但两者皆为抽象类,且后者为隐式sealed,不能继承,也就是不能创建实例,那么要想创建代理类应该怎么做呢,net提供了delegate关键字,使用该关键字标示的类型会被编译器自动编译为继承自multicastDelegate的类,见如下截图
multicastdelegate提供了protected的构造器估计就是为了内部创建使用的吧。
虽然我们不能显示继承该类,却可以通过delegate来继承,所以可以通过new来创建他。个人理解multicastdelegate就是一个容器,当我们使用c.Message = new messagedelegate(c_message)创建它时,或者使用c.Message += new messagedelegate(c_message)来添加注册时,都是往其内部的list中添加引用,一旦该list为空,该对象也为null。
完成代理需要5个步骤:
1.声明代理类型(编译为类)
2.声明以上代理类型(类)的实例
3.需要加载到代理上的方法,需要和代理类型相同
4.注册,将方法+=到实例上
5.调用
详见实例:
public delegate void MessageDelegate(string message); // step 1
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
Closure c = new Closure();
c.sendMessage += messageUpdate; // step4
c.fun(); // step 5,应该放在符合逻辑的位置
}
private void messageUpdate(string message) //step 3
{
Console.Write(message);
}
}
public class Closure
{
public MessageDelegate sendMessage; //step2
public void fun() //step 5
{
if (sendMessage != null)
{
string message = "please update";
sendMessage(message);
}
}
事件是特殊的代理,.net为其专门封装了EventHandler代理,不过如果不使用该delegate也同样可以声明为事件,两者区别具体见另一文。