C#的事件与托管(代码理解)

 

using System;


namespace MyCollections

{

    using System.Collections;


    public delegate void ChangedEventHandler(object sender, EventArgs e);


    public class ListWithChangedEvent : ArrayList

    {

        /* 声明一个事件,名称为Changed,并指明用ChangedEventHandler作为委托

        当触发Changed事件时,可以通过ChangedEventHandler这个委托进行事件处理*/

        public event ChangedEventHandler Changed;


        public event ChangedEventHandler Added;

        protected virtual void OnChanged(EventArgs e)

        {

            /* 事件调用: (调用事件的语法和调用方法类似,直接使用事件的名称,并传入事件的参数就可以了)

            *

            * 先判断是否有对象将委托与该事件关联,

            * 如果没有对象将委托与事件关联,则委托的事件为null

            * 调用事件时先检查是否为null,如果不为null,再调用该事件。

            * ※其实也可以理解为事件Changed当使用+=之后,Changed被赋值了(即被关联了委托ChangedEventHandler

            * ※同时由于委托指向了方法,因此当事件Changed发生时,被指向的方法也就可以被调用了。

            */

            if (Changed != null)

                Changed(this, e);

        }


        protected virtual void OnAdded(EventArgs e)

        {

            if (Added != null)

             Added(this, EventArgs.Empty);

        }


        /* 当调用AddClear或者set数组的时候,就会调用OnChanged方法,而OnChanged方法中调用了Changed事件,

        * 所以也可以说当调用如下的方法时调用了Change事件 */

        public override int Add(object value)

        {

            int i= base.Add(value);

            OnAdded(EventArgs.Empty);

            return i;

        }


        public override void Clear()

        {

            base.Clear();

            OnChanged(EventArgs.Empty);

        }


        public override object this[int index]

        {

            set

                {

                    base[index] = value;

                    OnChanged(EventArgs.Empty);

                }

        }

    }

}


namespace TestEvents

{

    using MyCollections;


    class Test

    {

        public static void Main()

        {

            ListWithChangedEvent list = new ListWithChangedEvent();



            list.Added += new ChangedEventHandler(ListAdded);


            /*

            * +=将事件和委托关联在一起,使用-=解除关联。一旦建立起这种关联,委托就可以调用事件发生时处理的方法。

            * 事件Changed和委托ChangedEventHandler关联在一起,并指明当事件发生时,调用参数中指明的方法ListChanged

            * 这样,ChangedEventHandler就知道,当对象的状态改变时,就调用Changed事件,调用Changed事件时就执行ListChanged这个方法。

            */

            list.Changed += new ChangedEventHandler(ListChanged);

            //以上的一步可以分解成如下二步:

            //ChangedEventHandler a = new ChangedEventHandler(ListChanged);

            //List.Changed += a;

            list.Add("item 1");

            list[0] = "item 2";

            list.Clear();

            list.Added -= new ChangedEventHandler(ListAdded);

            list.Changed -= new ChangedEventHandler(ListChanged);


        }


        private static void ListChanged(object sender, EventArgs e)

        {

            /* 事件处理方法的参数类型和个数必须和delegate类型定义的一致,不过参数的名称可以相同也可以不同 */

            Console.WriteLine("Changed or Cleared");

        }


        private static void ListAdded(object sender, EventArgs e)

        {

            Console.WriteLine("Added");

        }


    }

}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值