c# 代理 事件

来源:互联网 发布:网络商标通用网址 编辑:程序博客网 时间:2024/05/23 00:02

.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也同样可以声明为事件,两者区别具体见另一文。

原创粉丝点击