`
北极的。鱼
  • 浏览: 159129 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

c# 简单的事件例子

阅读更多
using System;
using System.Collections.Generic;
using System.Text;

namespace Delegate
{
    // 热水器 
    public class Heater
    {
        private int temperature;
        public string type = "RealFire";       // 添加型号作为演示 
        public string area = "China";         // 添加产地作为演示 

        //声明委托 
        public delegate void BoiledEventHandler(Object sender, BoiledEventArgs e);
        public event BoiledEventHandler Boiled; //声明事件 

        // 定义BoiledEventArgs类,传递给Observer所感兴趣的信息 
        public class BoiledEventArgs : EventArgs
        {
            public readonly int temperature;
            public BoiledEventArgs(int temperature)
            {
                this.temperature = temperature;
            }
        }

        // 可以供继承自 Heater 的类重写,以便继承类拒绝其他对象对它的监视 
        protected virtual void OnBoiled(BoiledEventArgs e)
        {
            if (Boiled != null)
            { // 如果有对象注册 
                Boiled(this, e);  // 调用所有注册对象的方法 
            }
        }

        // 烧水。 
        public void BoilWater()
        {
            for (int i = 0; i <= 100; i++)
            {
                temperature = i;
                if (temperature > 95)
                {
                    //建立BoliedEventArgs 对象。   
                    BoiledEventArgs e = new BoiledEventArgs(temperature);
                    OnBoiled(e);       // 调用 OnBolied方法   
                }
            }
        }
    }

    // 警报器 
    public class Alarm
    {
        public void MakeAlert(Object sender, Heater.BoiledEventArgs e)
        {
            Heater heater = (Heater)sender;     //这里是不是很熟悉呢? 
            //访问 sender 中的公共字段 
            Console.WriteLine("Alarm:{0} - {1}", heater.area, heater.type);
            Console.WriteLine("Alarm:嘀嘀嘀,水已经 {0} 度了:", e.temperature);
            Console.WriteLine();
        }
    }

    // 显示器 
    public class Display
    {
        public static void ShowMsg(Object sender, Heater.BoiledEventArgs e)
        {   //静态方法 
            Heater heater = (Heater)sender;
            Console.WriteLine("Display:{0} - {1}:", heater.area, heater.type);
            Console.WriteLine("Display:水快烧开了,当前温度:{0}度。", e.temperature);
            Console.WriteLine();
        }
    }

    class Program
    {
        static void Main()
        {
            Heater heater = new Heater();
            Alarm alarm = new Alarm();

            heater.Boiled += alarm.MakeAlert;       //注册方法   
            heater.Boiled += (new Alarm()).MakeAlert;              //给匿名对象注册方法   
            heater.Boiled += new Heater.BoiledEventHandler(alarm.MakeAlert);       //也可以这么注册   
            heater.Boiled += Display.ShowMsg;              //注册静态方法    

            heater.BoilWater();       //烧水,会自动调用注册过对象的方法   

            Console.ReadKey();
        }
    }
}

 

很简单的事件例子,方便大家理解。

备:其实大家理解事件定义,可以理解为封装一个委托对象。

这里。BoiledEventHandler其实是一个事件订阅列表。Boiled其实是前者的一个对象,我们可以看到在热水器类(Heater)里面是用public event BoiledEventHandler Boiled;来声明了事件对象,没有实例化。在订阅者类中才用+=操作符实例化的。所以为什么在事件源类【这里是热水器类(Heater)】中触发事件前要先判断下这个事件是否为空
(见我红色标注出来的代码)。如果不为空才触发事件。所以如果你把订阅者中的订阅事件处理方法(见我蓝色标注的地方)注释掉。那么在事件源中事件对象就为NULL了,就不会触发事件了。
各位可以这么理解:纯属本人为了帮助理解的,如果错了,别拍我哈!

BoiledEventHandler是一个数组列表,Boiled就是他们里面的一个元素。你要操作Boiled的话,必须要实例化Boiled才能操作。这里的实例话就是你说的注册这个事件实例化。

 

分享到:
评论

相关推荐

    c#委托事件异步例子

    在这个例子中,`Publisher`类发布`MyEvent`事件,而`Subscriber`类订阅这个事件并提供处理方法。 总结,C#的委托和事件是实现异步编程和事件驱动编程的核心机制。通过委托,我们可以创建灵活的回调功能;通过异步...

    C#自定义事件例子

    在这个例子中,`RaiseCustomEvent`方法可以由用户调用来触发自定义事件,同时传递自定义的事件参数。其他类可以订阅`CustomEvent`,并在事件发生时接收到包含`Message`的`CustomEventArgs`对象。 总结,C#的自定义...

    简单的C#事件使用DEMO(详细的注释+简单易懂的例子)

    这个“简单的C#事件使用DEMO”是一个很好的起点,帮助初学者理解事件的工作原理和如何在实践中应用。下面将详细解释相关知识点。 1. **事件的概念**: 事件是类的成员,它表示特定状态的改变或操作的发生。事件的...

    C# 委托事件简单的使用例子

    这是C# 委托与事件简单的使用例子。 只是为了初学者更好的接受委托与事件使用方法而已。 程序有两个窗体,一个是主窗体,一个是副窗体。 打开主窗体,在主窗体中点按钮后,打开副窗体,在副窗体中,可以调整主窗体...

    C#事件和委托定义与使用(有两个很形象的例子)

    在这个例子中,`Publisher`类发布`MyEvent`事件,而`Subscriber`类订阅这个事件。当`Publisher`调用`RaiseEvent`时,所有订阅了该事件的`Subscriber`对象的`OnMyEvent`方法都会被调用。 为了确保良好的设计,C#遵循...

    c# 事件委托例子

    本文将深入探讨C#中的事件和委托,并通过一个简单的实例来阐述它们的工作原理。 首先,我们需要了解什么是委托。在C#中,委托可以看作是一种类型安全的函数指针,它允许我们传递方法作为参数或存储方法以备后用。...

    C#串口简单例子

    本篇将围绕"C#串口简单例子"这个主题,详细介绍如何在C#中实现串口通信,以及相关的编程知识。 首先,我们了解下串口通信的基本概念。串口通信是指数据以串行方式按位发送和接收,通常包括标准的RS-232、USB转串口...

    C# 事件的实例

    下面是一个简单的事件声明示例: ```csharp public event EventHandler&lt;MyEventArgs&gt; DocumentChanged; ``` 在这里,`EventHandler&lt;T&gt;` 是预定义的事件处理程序类型,`MyEventArgs` 是自定义的事件参数类,继承自 ...

    C# winform 单击与双击事件同时存在例子

    在C# WinForm开发中,用户界面交互是一个关键部分,其中单击(Click)和双击(DoubleClick)事件是常见的用户输入响应。然而,标题提到的一个常见问题是:在同一个控件上,C# WinForm不支持同时处理单击和双击事件。...

    C#例子 源代码

    5. **委托与事件**:C#的委托和事件机制使得异步编程变得简单。委托是类型安全的函数指针,而事件则是实现观察者模式的一种方式。在UI编程中,它们尤为重要。 6. **泛型**:泛型提供了一种方式,可以在不指定特定...

    160多个C#WinForm简单小例子

    标题"160多个C# WinForm简单小例子"表明这是一份包含大量示例代码的资源集合,旨在帮助初学者快速理解和掌握C# WinForm编程的基本概念和技巧。 描述中提到,这些小例子"有的只是几行代码",这表明它们设计得非常...

    C#中事件委托订阅发布模式

    下面是一个简单的C#事件示例: ```csharp using System; // 发布者类 public class Publisher { // 定义事件,使用EventHandler委托 public event EventHandler MyEvent; // 触发事件的方法 public void ...

    c#弱事件简单实例代码

    在"ConsoleApplicationEventTest"这个例子中,我们将看到一个简单的弱事件实现,它通过控制台应用程序演示了弱事件的工作流程。以下是这个实例可能涉及的关键知识点: 1. **事件发布者(Publisher)**:发布者是...

    100个C#实例程序例子 源码

    这个"100个C#实例程序例子 源码"的压缩包,显然是为了帮助新手快速入门C#编程而准备的。以下是这些实例可能涵盖的一些关键知识点: 1. **基础语法**:C#的基本语法结构,包括变量声明、数据类型(如int、string、...

    C#基础知识例子

    C#是一种广泛应用于软件开发,尤其是Windows...这个压缩包中的代码例子涵盖了这些基本概念,并可能包含更具体的用法,如LINQ查询、异步编程、事件处理等。通过实践这些例子,你将能深入理解C#的基础类并提升编程能力。

    51个c#小程序例子

    标题“51个C#小程序例子”表明这是一份包含多个示例项目的资源,旨在帮助学习者通过实践来深化对C#的理解。描述中的“输出图形”和“实时获取CPU使用率”提到了两个具体的示例类型,一个是图形绘制,另一个是系统...

    事件分发_C#_事件分发_serious791_

    下面是一个简单的事件分发示例: ```csharp public class EventPublisher { // 声明事件,类型为EventHandler,它是一个内置的多播委托,用于处理事件 public event EventHandler MyEvent; // 触发事件的方法 ...

    C# Event小例子

    在C#编程语言中,事件(Event)是...通过这个实例,你可以学习到C#事件的核心概念,包括如何声明事件、如何触发事件以及如何订阅和取消订阅事件。这将有助于你在实际项目中更好地利用事件进行组件间的通信和状态管理。

    C# 委托 线程 事件的事例代码

    在C#编程中,委托、线程和事件是三个核心概念,它们对于构建高效、响应式的多任务应用程序至关重要。下面将详细阐述这三个概念及其相互之间的关系,并通过一个实例代码进行说明。 1. 委托(Delegate): 委托在C#中...

    C#50例,c#入门的例子程序!

    1. 基本语法:这50个例子涵盖了C#的基础语法,包括变量声明、数据类型(如int、string、bool等)、运算符(算术、比较、逻辑等)、流程控制(if-else、switch、for、while等)。 2. 函数与方法:通过实例,你可以...

Global site tag (gtag.js) - Google Analytics