C#完整事件声明

**事件这种成员,无论是从表层约束来讲,还是底层实践来讲,都是依赖于委托类型的。**

具体见订餐实例,出自刘铁锰老师C#课程,但课程里面有许多并不必要的代码,其作用只是为了丰富订餐这个事例,与事件声明并无关系,反而会给初学者造成困扰,本文经过对该例代码进行注释和修改之后,更有利于初学者理解完整事件声明的格式和过程,详细代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 订餐实例_10._21_
{
    class Program
    {
        static void Main(string[] args)
        {
            Customer customer = new Customer();//创建事件拥有者
            Waiter waiter = new Waiter();//创建时间响应者
            customer.Order += waiter.Action;//事件、订阅、事件处理器
            customer.ChuFa();//执行触发方法
            customer.PayTheBill();//执行付账方法
        }
    }
    public class OrderEventArgs : EventArgs//创建用于传递事件信息的累,类名需要设定为事件名+EventArgs,并且需要继承自EventArgs类(记住就行)
    {
        public string DishName { get; set; }
        public string Size { get; set; }//创建两个属性,用于存放事件信息
    }
    public delegate void OrderEventHandler(Customer customer, OrderEventArgs e);//创建委托,委托名为事件名+EventHandler
    public class Customer//事件拥有者类,类的访问级别都要改为公开
    {
        private OrderEventHandler orderEventHandler;//使用委托类型声明一个字段,用于存储和引用事件处理器,有了字段就可以声明事件了
        public event OrderEventHandler Order//声明事件,用OrderEventHandler来约束这个事件
        {
            add
            {
                this.orderEventHandler += value;//此时的value是从外界传进来的orderEventHandler字段,但不知具体类型,因此写value
            }
            remove
            {
                this.orderEventHandler -= value;
            }
        }
        public double Bill { get; set; }//付账属性
        public void PayTheBill()//付账方法
        {
            Console.WriteLine("I will pay ${0}.",this.Bill);
        }
        public void ChuFa()//设置事件的触发方法
        {
            if(this.orderEventHandler!=null)
            {
                OrderEventArgs e = new OrderEventArgs();//创建事件信息实例
                e.DishName = "Kongpao Chicken";
                e.Size = "large";
                this.orderEventHandler.Invoke(this, e);//调用委托,触发事件
            }
        }
    }
    public class Waiter//事件响应者类
    {
        public void Action(Customer customer, OrderEventArgs e)//事件处理器
        {
            Console.WriteLine("I will serve you ths dish-{0}.",e.DishName);
            double price = 10;//无论何菜,标准价格为10元
            switch (e.Size)//根据菜的分量更改价格
            {
                case "small":
                    price *= 0.5;
                    break;
                case "large":
                    price *= 1.5;
                    break;
                default:
                    break;
            }
            customer.Bill += price;//将菜价加到账单属性上
        }
    }
}

执行结果为:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一斤阳光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值