C#事件的简略声明

C#事件的简略声明

声明事件的五个要素部分:

        1、事件的拥有者--customer1
        2、事件的响应者--Waiter1
        3、事件--customer1.Order
        4、事件的处理器--Waiter1.Action
        5、事件的订阅--+=

事件简略声明相对与完整声明主要的改动

事件触发简略声明需要注意的是因为不同于完整声明,简略声明已经将委托字段省略掉所以本应调用字段orderEventHandler在此处会报错,此时按照C#的语法糖衣应该用事件order去替换掉orderEventHandler。简而言之,相对于完整声明,简略声明省略掉了委托字段、事件的添加器与移除器以及添加语法糖衣将事件order去替换掉事件拥有者customer的委托调用
根据方法的单一职责(single responsibility)的原则,一个方法只能完成一个功能,约定事件的触发方法前面需要加On

代码实现

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

namespace ConsoleApp1
{
/********************************************事件调用********************************************************/    
    class program
    {
        static void Main (string[] args )
        {
            //声明事件的五个部分:
            //1、事件的拥有者--customer1
            //2、事件的响应者--Waiter1
            //3、事件--customer1.Order
            //4、事件的处理器--Waiter1.Action
            //5、事件的订阅--+=
            //6、事件的触发应该在事件的拥有者里去触发
            Customer customer1 = new Customer();
            Waiter Waiter1 = new Waiter();
            customer1.Order += Waiter1.Action;//<5>事件订阅事件处理器,处理器位于事件响应者中
            Console.Read();
            customer1.Think();
            customer1.PayTheBill();
            Console.WriteLine("Mission complete");
            Console.ReadKey();

        }
    }
    public  class OrderEventArgs:EventArgs
    {
        //声明属性时应当先输入prop,然后再敲击两下TAB键会自动声明后面的get,set方法
        public string DishName { get; set; }
        public string Size { get; set; }

    }
    //委托类型
    public delegate void OrderEventHandler(Customer Customer, OrderEventArgs e);

    public  class Customer

    {
        //委托字段,用于存储和引用事件处理器
        //private OrderEventHandler orderEventHandler;//1、...委托简略声明可将委托字段省略
        //事件声明
        public event OrderEventHandler Order;
        //2、...在简略声明里会将事件的添加器与移除器的声明也省略掉
        /*
        {
            //事件添加器
            add
            {
                //订阅用+=符号表示,value
                this.orderEventHandler += value;
            }
            //事件处理器的移除器
            remove
            {
                this.orderEventHandler -= value;
            }
        }
        */
        public double Bill { get; set; }

        public void PayTheBill ()
        {
            Console.WriteLine("I will pay the {0} $",this.Bill);
        }
 
        public void Think()
        {
            Console.WriteLine("I am thinking...");
            this.Onorder();
        }

        //根据方法的单一职责(single responsibility)的原则,一个方法只能完成一个功能,约定事件的触发方法前面需要加On
        protected void Onorder()
        {
            //事件触发完整声明
            /*
            if (this.orderEventHandler != null)
            {
                OrderEventArgs e = new OrderEventArgs();
                e.DishName = "Potato";
                e.Size = "large";
                //触发事件用Invoke
                this.orderEventHandler.Invoke(this, e);
            }
            */

            //3、事件触发简略声明,需要注意的是因为不同于完整声明,简略声明已经将委托字段省略掉所以本应调用字段orderEventHandler在此处
            //会报错,此时按照C#的语法糖衣应该用事件order去替换掉orderEventHandler。简而言之,相对于完整声明,简略声明省略掉了委托字段、
            //事件的添加器与移除器以及添加语法糖衣将事件order去替换掉事件拥有者customer的委托调用
            if (this.Order != null)
            {
                OrderEventArgs e = new OrderEventArgs();
                e.DishName = "Potato";
                e.Size = "large";
                //触发事件用Invoke
                this.Order.Invoke(this, e);
            }
        }
    }

    public class Waiter
    {
        public void Action(Customer Customer, OrderEventArgs e)
        {
            Console.WriteLine("I will serve you the dish.{0}", e.DishName);
            double price = 10;
            switch (e.Size)
            {
                case "small":
                    price *= 0.5;
                    break;
                case "large":
                    price *= 1.5;
                    break;
                default:
                    break;

            }
            Customer.Bill += price;
        }
    }
}

没有外部事件参数传递的情况示例

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

namespace ConsoleApp1
{
    //事件及委托调用方法
    class CustomerDashList
    {
        protected int dash1;
        protected int dash2;
        protected int dash3;
    }
    //declear delegate 声明委托>>此委托未包含实例传递
    public delegate int ServerClear(int x, int y, int z);

    class Customer:CustomerDashList
    {
       
        //declear event 声明事件及名称
        public event ServerClear ClearEvent;
       
        public void OrderDash(int x,int y,int z)
        {
            this.dash1 = x;
            this.dash2 = y;
            this.dash3 = z;
        }
        public void Checkout()
        {
            int money;
            //quote the event调用事件
            if (ClearEvent != null)
                money = ClearEvent(dash1, dash2, dash3);
            else
                money = 0;
            Console.WriteLine("you need pay {0} dallers", money);
        }
        
    }
    class Server
    {
        public int ClearDish(int x,int y, int Z)
        {
            Console.WriteLine("at your service!");
            return x * 10 + y * 15 + Z * 20;
        }
    }
    class DelegateOrder
    {
        static void Main(string[] args)
        {
            Customer c1 = new Customer();
            Customer c2 = new Customer();
            Server s1 = new Server();
            //subscribe delegate 
            c1.ClearEvent += new ServerClear(s1.ClearDish);
            c2.ClearEvent += new ServerClear(s1.ClearDish);
            c1.OrderDash(1, 2, 5);
            c2.OrderDash(0, 2, 2);
            c1.Checkout();
            c2.Checkout();
            Console.ReadKey();



        }
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值