关于委托声明的标准形式和EventHandler和EventArgs

本文探讨了委托声明的标准格式,强调了Object参数代表发布者类的对象,以及可能涉及的YYYEventArgs类型的数据传递。同时,介绍了在声明委托时使用EventHandler后缀,以及定义相关数据类时采用EventArgs后缀的规范。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

和之前的对比主要就是改了一个格式Object XXX(发布者类的对象)和可能存在的需要传递的数据YYYEventArgs。
标准格式的委托声明包含一个发布者类的对象,参数类型为Object(对象的父类);一个可能需要传递的数据,属于YYYEventArgs类型。
委托在声明的时候名称后面加上EventHandler后缀,定义需要传递的数据类时,名称加上EventArgs后缀。

namespace Delegate
{
    // 热水器
    public class Heater
    {
        private int temperature;
       
        public string type = "RealFire 001";       // 添加型号作为演示
        
        public string area = "China Xian";         // 添加产地作为演示
        //声明委托,对于委托的命名通常以EventHandler结尾。两个参数一个Object 类型,一个 EventArgs类型(或继承自EventArgs,命名为YYYEventArgs),
        //形式上写作(Object XXX,YYYEventArgs Z)。XXX为事件发布者类型的对象,YYYEventArgs类为订阅者类需要用的数据所在类,有时不需要就为null  
        public delegate void BoiledEventHandler(Object sender, BoiledEventArgs e);
        
        public event BoiledEventHandler Boiled; //声明事件

        // 定义BoiledEventArgs类,此类中只包含了一个成员temperature,是订阅者类需要用到的数据。这是Heater类内部的一个类
        public class BoiledEventArgs : EventArgs
        {
            //包含一个属性
            public readonly int Temperature;
            //定义构造函数功能为读取输入的温度
            public BoiledEventArgs(int temperature)
            {
                this.Temperature = temperature;
            }
            //也可以不用构造函数,写一个这样的函数方法
            /*public readonly int get_temperature(int tem)
            {
                return tem;
            }*/
        }

        // 加热
        public void BoilWater()
        {
            for (int i = 0; i <= 100; i++)
            {
                temperature = i;
                
                if (temperature > 95)
                {
                    //建立BoiledEventArgs 对象。
                    BoiledEventArgs e = new BoiledEventArgs(temperature);
                    if (Boiled != null)
                    {
                        Boiled(this, e);//this就是当前类Heater类的对象,委托结构的第一个参数,相当于Heater heater = new Heater();Boiled(heater,e);              
                        break;
                    }
                }
            }
        }
    }

    // 警报器
    public class Alarm
    {
        public void MakeAlert(Object sender, Heater.BoiledEventArgs e)//签名与委托的一致
        {
            Heater heater = new Heater();
            
            sender = heater;               //sender是Heater类型的对象
            //访问 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 = new Heater ();
            
            sender = heater;
            
            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 += Display.ShowMsg;    //注册静态方法似乎不可以实例化引用
            
            heater.BoilWater();   //烧水,会自动调用注册过对象的方法

            Console.ReadKey();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值