C# -- delegate 与 event 解析

来源:互联网 发布:淘宝中差评处理 编辑:程序博客网 时间:2024/05/17 04:21
/// <summary>/// Delegate是类型,Event是成员(本质为成员方法),Event成员类型派生于Delegate/// </summary>namespace MyEvent{    //1.声明委托的类型    public delegate void ChangedEventHandler(object sender,EventArgs e);    //2.列表,当列表数据发生变化的时候会改变 --> Changed --> 通知委托它的事件    public class ListWithChangedEvent : ArrayList    {        //委托的实例 -- event!!!        public event ChangedEventHandler Changed;        public override int Add(object value)        {            int i = base.Add(value);            OnChanged(EventArgs.Empty);//4.只是封装了一下下,本质上就是 --> Changed(this, e);            return i;        }        public override void Clear()        {            base.Clear();            OnChanged(EventArgs.Empty);        }        protected virtual void OnChanged(EventArgs e)        {            if (Changed != null)                Changed(this, e);        }        public override object this[int index]        {            set            {                base[index] = value;                OnChanged(EventArgs.Empty);            }        }    }    //5.监听列表变化,添加委托,一旦发生变化,会调用这里边的回掉方法    class EventListener    {        private ListWithChangedEvent List;        //6.传入要坚挺的列表对象        public EventListener(ListWithChangedEvent list)        {            List = list;            //委托 --> 注册监听 --> 委托直接传入方法,实际上添加的是方法的地址 --> eg:传入的方法不需要括号,明白没?            List.Changed += new ChangedEventHandler(ListChanged);        }        //参数域返回值都必须与委托声明的一致,列表变化回掉的方法        private void ListChanged(object sender, EventArgs e)        {            Console.WriteLine("This list is changed.");        }        public void Dettach()        {            List.Changed -= new ChangedEventHandler(ListChanged);            List = null;        }    }    class Program    {        static void Main(string[] args)        {            //初始化委托            ListWithChangedEvent list = new ListWithChangedEvent();            //添加委托            EventListener listener = new EventListener(list);            list.Add("1");            list.Clear();            listener.Dettach();            list.Add("2");            Console.ReadKey();        }    }}
1 0
原创粉丝点击