C#每日一课(三十一)

40 篇文章 1 订阅

c#事件
事件(Event),可以说是一个用户的操作,比如用户点击了鼠标,按了键盘……,或者是出现一些系统上的通知,应用程序需要在事件发生的时候对这些事件做响应。

  • 事件的发布-订阅模型
    事件在类中声明且生成,且通过使用同一个类或其他类当中的委托与件处理程序关联。
    其中包含事件的类用于发布事件,称为发布器(publisher)类
    其他接受事件的类称为订阅器(subscriber)类

  • 声明事件
    1.声明事件的委托类型
    如:public delegate void LogHandler(string status);
    2.基于委托来定义事件
    如:public event LogHandler log;

使用Visual Studio新建C#控制台应用程序
添加如下代码:

namespace chapter22_007
{
    class EventTest
    {
        private int number;
        //声明一个委托
        public delegate void NumHandler();
        //基于委托定义事件
        public event NumHandler ChangeNum;

        protected virtual void OnNumChanged()
        {
            if (ChangeNum != null)
            {
                ChangeNum();
            }
            else
            {
                Console.WriteLine("事件触发!");
            }
        }
        public EventTest(int n)
        {
            SetNumber(n);
        }
        public void SetNumber(int n)
        {
            if (number != n)
            {
                number = n;
                OnNumChanged();
            } 
        }

        static void Main(string[] args)
        {
            EventTest e = new EventTest(100);
            e.SetNumber(200);
            e.SetNumber(200);
            e.SetNumber(1000);
            Console.ReadKey();
        }
    }
}

编译运行结果如下:
运行结果

使用Visual Studio新建C#控制台应用程序chapter22_008(摘自W3Cschool,其中代码有少部分修正)

 class Boiler
    {
        private int temp;
        private int pressure;
        public Boiler(int t, int p)
        {
            temp = t;
            pressure = p;
        }
        public int getTemp()
        {
            return temp;
        }
        public int getPressure()
        {
            return pressure;
        }
    }

    //事件发布器
    class DelegateBoilerEvent
    {
        //声明一个委托
        public delegate void BoilerLogHandler(string status);
        //基于委托定义事件
        public event BoilerLogHandler BoilerEventLog;

        public void LogProcess()
        {
            string remarks = "O. K";
            Boiler b = new Boiler(100, 12);
            int t = b.getTemp();
            int p = b.getPressure();
            if (t > 150 || t < 80 || p < 12 || p > 15)
            {
                remarks = "Need Maintenance";
            }
            OnBoilerEventLog("Logging Info:\n");
            OnBoilerEventLog("Temparature " + t + "\nPressure: " + p);
            OnBoilerEventLog("\nMessage: " + remarks);
        }

        private void OnBoilerEventLog(string message)
        {
            if (BoilerEventLog != null)
            {
                BoilerEventLog(message);
            }
        }
    }


    class BoilerInfoLogger
    {
        FileStream fs;
        StreamWriter sw;
        public BoilerInfoLogger(string filename)
        {
            fs = new FileStream(filename, FileMode.Append, FileAccess.Write);
            sw = new StreamWriter(fs);
        }
        public void Logger(string info)
        {
            sw.WriteLine(info);
        }
        public void Close()
        {
            sw.Flush();
            sw.Close();
            fs.Close();
        }
    }

    //事件订阅器

    class RecordBoilerInfo
    {
        static void Logger(string info)
        {
            Console.WriteLine(info);
        }//end of Logger

        static void Main(string[] args)
        {
            BoilerInfoLogger filelog = new BoilerInfoLogger("..\\..\\boiler.txt");
            DelegateBoilerEvent boilerEvent = new DelegateBoilerEvent();
            boilerEvent.BoilerEventLog += new
            DelegateBoilerEvent.BoilerLogHandler(Logger);
            boilerEvent.BoilerEventLog += new
            DelegateBoilerEvent.BoilerLogHandler(filelog.Logger);
            boilerEvent.LogProcess();
            filelog.Close();
            Console.ReadKey();
           // filelog.Close();这个语句需要放在 Console.ReadKey()之前要不然文件中数据无法写入
        }//end of main

    }//end of RecordBoilerInf

编译运行结果如下:
运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值