c#中事件的定义

硅谷探秘者 2345 0 0

事件的声明和例子

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

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            Customer c = new Customer();//事件拥有者
            Waiter w = new Waiter();//事件响应者
            c.Order += w.WaiterAction;//事件订阅,从下面的代码中可以简单的理解为:事件的拥有者调用CustomerAction方法的时候,在此方法中通过委托调用事件响应者的WaiterAction方法。

            //我理解的委托就是:c#把c/c++中的方法指针进一步封装并去掉了指针的概念,然后叫做委托(一个委托就代表着一个方法)。
            //那么事件存在的意义是什么呢?是为了让程序逻辑更加严密,更加安全。

            c.CustomerAction();//用户点菜
            c.pay();//用户付账
        }
    }


    //点餐参数
    public class OrderEventArgs:EventArgs
    {
        public String DishName { set; get; }//名字
        public String Size { get; set; }//大分/小分
    }

    //声明一个委托类型,委托一个没有返回值,两个参数的方法
    public delegate void OrderEventHander(Customer c,OrderEventArgs e);

    //顾客
    public class Customer
    {
        //存储事件处理器,即把事件交给哪一个方法执行
        private OrderEventHander orderEventHander;

        //声明事件  另外OrderEventHander用于约束委托类型,即事件处理器只能是这种类型
        public event OrderEventHander Order{
            add
            {
                this.orderEventHander += value;
            }
            remove
            {
                this.orderEventHander -= value;
            }
        }

        public double Bill { get; set; }//账单
        public void pay()
        {
            //付钱
            Console.WriteLine("付钱:{0}",Bill);
        }

        //点菜动作
        public void CustomerAction()
        {
            OrderEventArgs e = new OrderEventArgs();
            e.Size = "large";
            e.DishName = "cai";
            orderEventHander(this,e);//触发事件
        }
    }

    //服务生
    public class Waiter
    {
        //服务生的事件处理器,也即用户触发点菜事件时,执行的方法
        internal void WaiterAction(Customer c, OrderEventArgs e)
        {
            Console.WriteLine("Waiter:上菜");
            double p = 10;
            switch (e.Size)
            {
                case "small":
                    p *= 0.5;
                    break;
                case "large":
                    p *= 1.5;
                    break;
                default:
                    break;
            }
            c.Bill += p;
        }
    }
}





评论区
请写下您的评论...
暂无评论...
猜你喜欢
weblog 2690 代码:namespaceConsoleApplication3{//声明自委托(委托方法返回值为int,有两个int类型形参)publicdelegateintdelegateTest
weblog 1918 vue表达式-数据绑-!DOCTYPEhtmlhtml head metacharset="UTF-8" title/title scriptsrc="https
weblog 2375 一个插.js(function(){ //需要向外暴露对象 constMyPlugin={}; MyPlugin.install=function(Vue,options){ //1
rabbitmq,springboot 1902 客户端应用程序。 为了消费,应用程序需要声明一个队列,并绑到一个系统指交换器去消费消息。 插在默认虚拟主机上声明了一个topic类型exchange(交换器
weblog 1720 layuitable表格单选监听以及选数据获取表格设置table.render({ elem:'#test' ,url:'[[@{/smmc/artificial}]]'+'?xsId
weblog 3123 c#数据类型 c#数据类型分为值类型和引用类型 值类型有包括(结构体类型,枚举类型) 引用类型又包括(类类型,数组类型,接口类型,委托类型) c#数据类型派生谱系 值类型
weblog 2343 一个案例说明#includeiostreamusingnamespacestd;/**函数指针*///typedef声明为一个指针函数类型MethodPointer//int为指针指向函数返回
算法基础 1081 一个,加入到这个。这是最常见选择。PROPAGATION_SUPPORTS支持当前务,如果当前没有务,就以非务方式执行。PROPAGATION_MANDATORY使用当前务,如果
归档
2018-11  12 2018-12  33 2019-01  28 2019-02  28 2019-03  32 2019-04  27 2019-05  33 2019-06  6 2019-07  12 2019-08  12 2019-09  21 2019-10  8 2019-11  15 2019-12  25 2020-01  9 2020-02  5 2020-03  16 2020-04  4 2020-06  1 2020-07  7 2020-08  13 2020-09  9 2020-10  5 2020-12  3 2021-01  1 2021-02  5 2021-03  7 2021-04  4 2021-05  4 2021-06  1 2021-07  7 2021-08  2 2021-09  8 2021-10  9 2021-11  16 2021-12  14 2022-01  7 2022-05  1 2022-08  3 2022-09  2 2022-10  2 2022-12  5 2023-01  3 2023-02  1 2023-03  4 2023-04  2 2023-06  3 2023-07  4 2023-08  1 2023-10  1 2024-02  1 2024-03  1 2024-04  1
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础 xxl-job rabbitmq haproxy srs 音视频 webrtc javascript
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。