C#EventHandler类

using System;

namespace EventHandler类
{
    class Program
    {
        /*
         背景:在事件发布和订阅的过程中,定义事件的类型(委托类型)是一件重复性工作
         语法:public delegate void EventHandler(object sender,EventAge e);
            第1参数 sender 表示引发事件的对象(传递该参数通常是this)
            第2参数 e 表示事件中包含的数据
         */
        static void Main(string[] args)
        {
            //创建学校铃声类
            SchoolRing sr = new SchoolRing();
            //创建学生实例
            Students students = new Students();
            //订阅铃声委托
            students.SubscribeToRing(sr);
            Console.WriteLine("请输入大铃声参数(1:表示上课铃;2:表示下课铃):");
            //打铃动作
            sr.Jow(Convert.ToInt32(Console.ReadLine()));

            Console.ReadLine();
        }
    }

    /// <summary>
    /// 声明一个委托类型
    /// </summary>
    /// <param name="ringKind">表示铃声种类(1 表示上课铃声;2 表示下课铃声)</param>
    public delegate void RingEvent(object sender,EventArgs e);

    public class SchoolRing
    {
        public event RingEvent OnBellSound;//委托发布
        //(插入知识点:添加event 以保证事件订阅可靠性,在发布委托的定义中加上event)
        //读取输入,并且做出判断
        public void Jow(int ringKind)
        {
            if (ringKind == 1 || ringKind == 2)
            {
                Console.Write(ringKind == 1 ? "上课铃响了," : "下课铃响了");
                if (OnBellSound != null)
                {//不等于空,说明它已订阅了具体的方法
                    OnBellSound(this,new RingEventArgs(ringKind));
                    //为了安全,事件成员只能由类型本身触发
                    //回调OnBellSound委托所订阅(引用)的具体方法
                }
            }
            else
            {
                Console.WriteLine("这个铃声参数不正确!");
            }
        }
    }

    public class Students
    {
        //学生订阅铃声这个委事件
        public void SubscribeToRing(SchoolRing schoolRing)
        {
            schoolRing.OnBellSound += SchoolJow;
        }

        private void SchoolJow(object sender,EventArgs e)
        {//e强制转化内RingEventArgs类型
            if (((RingEventArgs)e).RingKind == 2)
            {
                Console.WriteLine("同学们开始课间休息");
            } //e强制转化内RingEventArgs类型
            else if (((RingEventArgs)e).RingKind == 1)
            {
                Console.WriteLine("同学们开始认真学习");
            }
        }

        //与上面关联--执行事件
        //private void SchoolJow(int ringKind)
        //{
        //    if (ringKind == 2)
        //    {
        //        Console.WriteLine("同学们开始课间休息");
        //    }
        //    else if (ringKind == 1)
        //    {
        //        Console.WriteLine("同学们开始认真学习");
        //    }
        //}
        //取消订阅铃声动作
        public void CancelSubscribe(SchoolRing schoolRing)
        {
            schoolRing.OnBellSound -= SchoolJow;
        }
    }
    //新添加的
    public class RingEventArgs : EventArgs
    {
        private int _ringKind; //描述铃声种类的字段

        public int RingKind
        {
            get { return _ringKind; } //获取打铃参数
        }
        public RingEventArgs(int ringKind)
        {
            this._ringKind = ringKind; //在构造器中初始化铃声参数
        }
    }

   }

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页