如何引发事件

        事件功能是由三个互相联系的元素提供的:提供事件数据的类、事件委托和引发事件的类。

        .NET Framework 具有命名与事件相关的类和方法的约定。如果希望您的类引发一个名为 EventName 的事件,
        您需要以下元素:
            包含事件数据的类,名为 EventNameEventArgs。该类必须从 System.EventArgs 导出。
            事件的委托,名为 EventNameEventHandler。
            引发事件的类。该类必须提供事件声明 (EventName) 和引发事件 (OnEventName) 的方法。

        .NET Framework 类库或第三方类库中可能已经定义了事件数据类和事件委托类。在这种情况下,您就不需要定义这些类了。
例如,如果您的事件不使用自定义数据,可以使用 System.EventArgs 作为事件数据并使用 System.EventHandler 作为委托。

        使用 event 关键字在类中定义事件成员。当编译器在类中遇到 event 关键字时,它会创建一个私有成员,例如:
        private EventNameHandler eh = null;

        编译器还会创建两个公共方法,即 add_EventName 和 remove_EventName。这些方法是事件挂钩,它们允许委托与
事件委托 eh 合并或从该事件委托中移除。这些详细信息对程序员是隐藏的。

注意
        在除 C# 和 Visual Basic 2005 以外的其他语言中,编译器可能不自动生成与事件成员对应的代码,您可能需要显式地
定义事件挂钩和私有委托字段。

        定义事件实现后,您必须确定引发事件的时间。通过在定义事件的类或派生类中调用受保护的 OnEventName 方法来引发事件。
OnEventName 方法通过调用委托,传入所有事件特定的数据来引发事件。事件的委托方法可以执行事件操作或处理事件特定的数据。

注意
        受保护的 OnEventName 方法也允许派生类重写事件,而不必向其附加委托。派生类必须始终调用基类的 OnEventName 方法
以确保注册的委托接收到事件。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  下面的示例程序阐释如何在一个类中引发一个事件,然后在另一个类中处理该事件。AlarmClock 类定义公共事件 Alarm,
并提供引发该事件的方法。AlarmEventArgs 类派生自 EventArgs,并定义 Alarm 事件特定的数据。WakeMeUp 类定义处理 Alarm 事件的
AlarmRang 方法。AlarmDriver 类一起使用类,将使用 WakeMeUp 的 AlarmRang 方法设置为处理 AlarmClock 的 Alarm 事件。

一、AlarmClock 类

    public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
    public class AlarmClock
    {
        private bool snoozePressed = false;
        private int nrings = 0;
        private bool stop = false;

        public bool Stop
        {
            get { return stop; }
            set { stop = value; }
        }

        public bool SnoozePressed
        {
            get { return snoozePressed; }
            set { snoozePressed = value; }
        }

        public event AlarmEventHandler Alarm;

        protected virtual void OnAlarm(AlarmEventArgs e)
        {
            if (Alarm != null)
            {
                // Invokes the delegates.
                Alarm(this, e);
            }
        }
        public void Start()
        {
            for (; ; )
            {
                nrings++;
                if (stop)
                {
                    break;
                }

                else if (snoozePressed)
                {
                    System.Threading.Thread.Sleep(1000);
                    {
                        AlarmEventArgs e = new AlarmEventArgs(snoozePressed,
                           nrings);
                        OnAlarm(e);
                    }
                }
                else
                {
                    System.Threading.Thread.Sleep(300);
                    AlarmEventArgs e = new AlarmEventArgs(snoozePressed,
                       nrings);
                    OnAlarm(e);
                }
            }
        }
    }

 

二、AlarmEventArgs类

 public class AlarmEventArgs : EventArgs
    {
        private readonly bool snoozePressed;
        private readonly int nrings;

        public AlarmEventArgs(bool snoozePressed, int nrings)
        {
            this.snoozePressed = snoozePressed;
            this.nrings = nrings;
        }

        public int NumRings
        {
            get { return nrings; }
        }

        public bool SnoozePressed
        {
            get { return snoozePressed; }
        }


        public string AlarmText
        {
            get
            {
                if (snoozePressed)
                {
                    return ("Wake Up!!! Snooze time is over.");
                }
                else
                {
                    return ("Wake Up!");
                }
            }
        }
    }

 

三、WakeMeUp类

  public class WakeMeUp
    {

        public void AlarmRang(object sender, AlarmEventArgs e)
        {

            Console.WriteLine(e.AlarmText + "\n");

            if (!(e.SnoozePressed))
            {
                if (e.NumRings % 10 == 0)
                {
                    Console.WriteLine(" Let alarm ring? Enter Y");
                    Console.WriteLine(" Press Snooze? Enter N");
                    Console.WriteLine(" Stop Alarm? Enter Q");
                    String input = Console.ReadLine();

                    if (input.Equals("Y") || input.Equals("y")) return;

                    else if (input.Equals("N") || input.Equals("n"))
                    {
                        ((AlarmClock)sender).SnoozePressed = true;
                        return;
                    }
                    else
                    {
                        ((AlarmClock)sender).Stop = 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;
                else
                {
                    ((AlarmClock)sender).Stop = true;
                    return;
                }
            }
        }
    }

 

四、AlarmDriver类

 public class AlarmDriver
    {
        public static void Main(string[] args)
        {
            WakeMeUp w = new WakeMeUp();
            AlarmClock clock = new AlarmClock();
            clock.Alarm += new AlarmEventHandler(w.AlarmRang);
            clock.Start();
        }
    }
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值