博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
msdn 上的关于delegate和event的一个例子,理解后加点评论
阅读量:6832 次
发布时间:2019-06-26

本文共 4661 字,大约阅读时间需要 15 分钟。

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace EventSamle{        public class AlarmEventArgs : System.EventArgs//事件参数        {            private  bool _snoozPresed;//懒惰键            private int _nrings;//响了几次            public bool SnoozPressed            {                get { return _snoozPresed; }                set { _snoozPresed = value; }            }            public int NumRings            {                get { return _nrings; }                set { _nrings = value; }            }            public string AlarmText//提醒            {                get                {                    if (SnoozPressed)                        return ("Wake up!!! snooze time is over.");                    else                        return ("Wake up!!!");                }            }            public AlarmEventArgs(bool snooz, int nrings)            {                this._snoozPresed = snooz;                this._nrings = nrings;            }        }        public delegate void AlarmEventHander(object sender, AlarmEventArgs e);//1.声明委托事件处理函数,其实是个类        public class AlarmClock//产生事件的类        {            private bool _snoozPressed = false;            private int _nrings = 0;            private bool _stop = false;            public bool Stop//是否停止。事件类的域,这个例子中事件处理函数会反馈修改这个域的值            {                get { return _stop; }                set { _stop = value; }            }            public bool SnoozPressed//是否懒惰。事件类的域,这个例子中事件处理函数会反馈修改这个域的值            {                get { return _snoozPressed; }                set { _snoozPressed = value; }            }            public event AlarmEventHander Alarm;//2.声明一个事件,或叫做产生一个委托事件处理函数的实例            protected virtual void OnAlarm(AlarmEventArgs e)//3.触发事件的函数,protected            {                if (Alarm != null)//一定要加!                {                    Alarm(this, e);                }            }            public void Start()//调用这个函数后开始触发事件,传入参数            {                for (; ; )                {                    _nrings++;                    if (Stop)                        break;                    else if (SnoozPressed)                    {                        System.Threading.Thread.Sleep(1000);                        AlarmEventArgs e = new AlarmEventArgs(SnoozPressed, _nrings);                        OnAlarm(e);                    }                    else                    {                        System.Threading.Thread.Sleep(300);                        AlarmEventArgs e = new AlarmEventArgs(SnoozPressed, _nrings);                        OnAlarm(e);                    }                }            }        }        public class WakeUp//处理事件的类        {            public void RingRang(object sender, AlarmEventArgs e)//4.处理事件的函数,同delegate签名一样            {                Console.WriteLine(e.AlarmText+"\n");                if(!e.SnoozPressed)                {                    Console.WriteLine(" Let alarm ring? Enter Y");                    Console.WriteLine(" Stop Alarm? Enter Q");                     Console.WriteLine(" Press Snooze? Enter N");                    string input = Console.ReadLine();                    if(input.Equals("Y")||input.Equals("y")) return;                    else  if(input.Equals("Q")||input.Equals("q"))                     {                        ((AlarmClock)sender).Stop = true;//这个例子中可以向发送者反馈信息                        return;                    }                    else                    {                        ((AlarmClock)sender).SnoozPressed = true;                        return;                    }                }                else                 {                    Console.WriteLine(" Let alarm ring? Enter Y");                    Console.WriteLine(" Stop Alarm? Enter Q");                    string input = Console.ReadLine();                    if(input.Equals("Y")||input.Equals("y")) return;                    if(input.Equals("Q")||input.Equals("q"))                     {                        ((AlarmClock)sender).Stop = true;                        return;                    }                }            }        }          public class AlarmDriver//测试类   {        public static void Main (string[] args)      {           // Instantiates the event receiver.         WakeUp w= new WakeUp();                           // Instantiates the event source.         AlarmClock clock = new AlarmClock();         // Wires the AlarmRang method to the Alarm event.         clock.Alarm += new AlarmEventHander(w.RingRang);//把事件处理函数注册到事件处理队列中         clock.Start();      }   }   }

转载于:https://www.cnblogs.com/fengxuewo/archive/2011/09/28/2194728.html

你可能感兴趣的文章
Rest分页接口开发
查看>>
Mybatis中oracle如何批量insert语句
查看>>
org.aspectj.lang.JoinPoint-中文简要API(转)
查看>>
面向对象知识
查看>>
数据库中算式的简单例子
查看>>
AVFoundation自定义拍照
查看>>
测试显示GitHub的Gist
查看>>
JavaScript学习——JavaScript基础
查看>>
JSP学习-07Cookie 与Session
查看>>
对对象使用[]的方式使用属性的一个例子的理解
查看>>
MS .NET企业级应用架构设计笔记1(关于业务层)
查看>>
【Codeforces Round #406 (Div. 2)】题解
查看>>
php基本语法
查看>>
页面加载顺序的问题
查看>>
防止人为误操作MySQL数据库技巧一例
查看>>
送给自己的春节回家最佳高薪充电技术
查看>>
用什么样的个人笔记类软件?OneNote、EverNote(印象笔记)、为知笔记、麦库记事、有道云笔记……...
查看>>
运维监控利器Nagios:概念、结构和功能
查看>>
《Python从小白到大牛》第7章 运算符
查看>>
C#中程序的退出
查看>>