C# 系统预定义的委托EventHandler

.net 预定义了两个委托EventHandler如下。

 //     表示将用于处理不具有事件数据的事件的方法。
    //
    // 参数:
    //   sender:
    //     事件源。
    //
    //   e:
    //     不包含事件数据的对象。
    [ComVisible(true)]
    public delegate void EventHandler(object sender, EventArgs e);
    //
    //   e:
    //     包含事件数据的对象。
    //
    // 类型参数:
    //   TEventArgs:
    //     事件生成的事件数据的类型。
    public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);
}

因此,在编写代码时可以直接使用这两个委托来声明事件,如下:

public event EventHandler EventHandlerNoPar;
public event EventHandler<ReportEventArgs> EventHandlerPar;
public class ReportEventArgs : EventArgs
    {
        public DateTime ClickTime { get; set; }

    }

例子

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

        public event EventHandler<BoiledEventArgs> 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)
                {
                    //建立BoiledEventArgs 对象。
                    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 += Display.ShowMsg;       //注册静态方法

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

原文地址:https://www.cnblogs.com/KQNLL/p/9193265.html

时间: 2024-10-29 00:35:19

C# 系统预定义的委托EventHandler的相关文章

.NET中那些所谓的新语法之三:系统预定义委托与Lambda表达式

开篇:在上一篇中,我们了解了匿名类.匿名方法与扩展方法等所谓的新语法,这一篇我们继续征程,看看系统预定义委托(Action/Func/Predicate)和超爱的Lambda表达式.为了方便码农们,.Net基类库针对实际开发中最常用的情形提供了几个预定义好的委托,这些委托可以直接使用,无需再重头定义一个自己的委托类型.预定义委托在.Net基类库中使用的比较广泛,比如在Lambda表达式和并行计算中都大量地使用,需要我们予以关注起来! /* 新语法索引 */ 1.自动属性 Auto-Impleme

WebService -- Java 实现之 CXF ( 添加系统预定义的拦截器)

1. 概述 CXF允许我们在webservice的in/out位置添加拦截器.拦截器有两大分类,一类是系统预定义的:另一类是自定义拦截器. 2. 在server端添加拦截器. JaxWsServerFactoryBean wsSvrFactoryBean = new JaxWsServerFactoryBean(); String address = "http://127.0.0.1/helloWorld"; wsSvrFactoryBean.setAddress(address);

SendMessage函数与MSDN系统预定义消息

SendMessage function https://msdn.microsoft.com/en-us/library/windows/desktop/ms644950%28v=vs.85%29.aspx 系统预定义消息 https://msdn.microsoft.com/en-us/library/windows/desktop/ms644927%28v=vs.85%29.aspx#system_defined 使复选框按钮选中 #define BM_SETCHECK        0x

Matlab——系统预定义的变量 常用数学函数

原文地址:https://www.cnblogs.com/expedition/p/10884591.html

EventHandler 与常见的.Net预定义委托

看着下面这两句事件定义及激发忽然有点不明白了, public event EventHandler<ExternalDataEventArgs> Submit; Submit(null, args); 貌似该事件定义时只传一个参数args, 但实际激发时要传两个参数, 咋回事捏! 其实, 这是误解, 这个EventHandler<ExternalDataEventArgs>是个泛型版的预定义委托, 该委托实际的定义如下: public delegate void EventHand

Colours–颜色库,包含100种预定义的颜色和方法

简介 Colours–颜色库,包含各种100种预定义的颜色和方法,可以简化颜色相关的开发工作. 项目主页: Colours 最新示例: 点击下载 快速入门 安装 通过Cocoapods安装 pod 'Colours' 手动安装 把 Colours.h 和 Colours.m拖进你的工程里,在需要的地方引入头文件即可: #import "Colours.h" 使用 调色板,一组预定义的颜色 具体可点击这里查看: 100个预定义的颜色 使用预定义的颜色 Colours 预定义了100 多种

c++IO之预定义格式控制

在C语言里,我们可以通过函数printf和scanf来进行格式化控制.而在C++中仍然包含了前者,但还提供了以下两种格式控制的方法:(1)使用流成员函数进行格式控制;(2)使用预定义操作符进行格式控制.下面我来一一介绍: 1.流成员函数主要是指ios类(流基类)中的,分别有: (1).设置状态标志流成员函数setf 一般格式:long ios::setf(long flags),调用格式:流对象.setf(ios::状态标志) ios类的状态标志有: 因为状态标志在ios类中定义为枚举值,所以在

五十九、SAP中常用预定义系统变量

一.SAP中常用预定义系统变量 内容如下: 二.系统变量定义在结构SYST里,我们打开SE38 三.在代码编辑器输入SYST变量 四.双击SYST,来到这个系统结构,里面有很多系统变量 五.我们随便写几个试试 六.显示界面如下 原文地址:https://www.cnblogs.com/tianpan2019/p/11221789.html

[转]关于VC预定义常量_WIN32,WIN32,_WIN64

VC2012 下写 Windows 程序时,有时需要判断编译环境.在之前的文章<判断程序是否运行在 Windows x64 系统下.>里说过如何在运行期间判断系统环境,但在编译时如何判断? MSDN 里说,VC 有 3 个预处理常量,分别是 _WIN32,_WIN64,WIN32.这三个常量如何使用呢?看起来简单,其实是很困惑的. 在 Win32 配置下,WIN32 在“项目属性-C/C++-预处理器-预处理器定义”里声明了,而在 x64 配置下,这个常量并不在项目预定义列表中.这是否说明可以