首页 > 其他分享 >.NET 事件

.NET 事件

时间:2022-10-03 09:11:59浏览次数:52  
标签:luncy goodsAgrs List lrp 事件 NET public

  事件分为发布器和订阅器
  发布器是包含委托定义和事件对象定义的类
  订阅器需要实现发布器约束的参数和返回值,也就是void返回并传一个发布器类型的参数和一个事件信息参数
  事件信息必须继承于EventArgs,用于存事件需要的信息,订阅器通过事件信息参数完成事件的处理
  事件和委托最大的区别,同时也是最大的作用,事件只能在发布器内调用委托里的方法,发布器外部只能添加和删除,也就是如果不从外部传参数,外部无法干扰到发布器类调用的参数

class Program
    {

        static void Main(string[] args)
        {//创建发布器对象
            Customer lrp = new Customer();
            Customer luncy = new Customer();
            //创建订阅器对象
            Cashier cashier = new Cashier();
            //注册订阅器对象
            lrp.Order += cashier.Closing;
            luncy.Order += cashier.Closing;
            lrp.Shopping("肥皂", 3, 10);
            lrp.Shopping("水桶", 2, 20);
            luncy.Shopping("毛巾", 3, 5);
            luncy.Shopping("雪糕", 4, 1);

            //调用事件
            Console.Write("lrp,");
            lrp.Action();
            Console.Write("luncy,");
            luncy.Action();
        }
    }

    public class GoodsAgrs : EventArgs//事件信息,存储货物信息和货物数量
    {
        private List<string> _goodName = new List<string>();
        private List<int> _goodPrice = new List<int>();
        private List<int> _goodNumber = new List<int>();
        public List<string> GoodName
        {
            get
            {
                return this._goodName;
            }
            set
            {
                this._goodName = value;
            }
        }
        public List<int> GoodPrice {
            get
            {
                return this._goodPrice;
            }
            set
            {
                this._goodPrice = value;
            }
        }
        public List<int> GoodNumber {
            get
            {
                return this._goodNumber;
            }
            set
            {
                this._goodNumber = value;
            }
        }
        public int TotalPrice { get; set; }
    }

    public class Customer//发布器,调用订阅器处理事件信息
    {
        public event EventHandler Order;
        public void Action()
        {
            if (Order != null)
            {
                Order(this, goods);
            }
        }
        private GoodsAgrs goods = new GoodsAgrs();
        public void Shopping(string goodName, int goodNumber, int goodPrice)
        {
            goods.GoodName.Add(goodName);
            goods.GoodNumber.Add(goodNumber);
            goods.GoodPrice.Add(goodPrice);
        }
    }

    public class Cashier//订阅器,处理事件信息
    {
        public void Closing(object sender, EventArgs e)
        {
            Customer cashier = sender as Customer;
            GoodsAgrs goodsAgrs = e as GoodsAgrs;
            Console.WriteLine("您购买了");
            for (int i = 0; i < goodsAgrs.GoodPrice.Count; i++)
            {
                goodsAgrs.TotalPrice += goodsAgrs.GoodNumber[i] * goodsAgrs.GoodPrice[i];
                Console.WriteLine("{0}*{1}", goodsAgrs.GoodName[i], goodsAgrs.GoodNumber[i]);
            }
            Console.WriteLine("您需要支付{0}元", goodsAgrs.TotalPrice);
        }
    }

  如果换成普通的委托也同样可以完成整个事件,但事件约束了委托在外部的使用,在外部事件定义的委托只能出现在+=或-=的左边,也就是只能添加和移除,如果外部可以直接调用事件并传入参数,那么上面的例子可能就会出现lrp.Order(lrp,luncy.goods)这种情况,所以事件就是一种约束,防止出现乱传参数的情况,保证程序的安全运行。

标签:luncy,goodsAgrs,List,lrp,事件,NET,public
From: https://www.cnblogs.com/lrplrplrp/p/16749998.html

相关文章

  • .NET Lambda表达式
    Lambda表达式(参数)=>表达式或语句块,如果只有一个并且类型可推断的话,括号可以省略。Lambda表达式可以引用外部的变量,引用的变量生命周期会延长到与Lambda相同......
  • js事件循环与macroµ任务队列-前端面试进阶
    背景一天惬意的下午。朋友给我分享了一道头条面试题,如下:asyncfunctionasync1(){console.log('async1start')awaitasync2()console.log('async1end......
  • ABAP语法笔记08 - 事件2和GUI状态
    ATLINE-SELECTION."双击行的时候触发的事件一般用来跳转TOP-OF-PAGEDURINGLINE-SELECTION."双击行显示的次级表单的抬头执行逻辑 GETCURSORFIELDfi......
  • 07_事件处理
    1.事件的基本使用<!DOCTYPEhtml><html><head><metacharset="UTF-8"/><title>事件的基本使用</title><!--引入Vue--><sc......
  • Kubernetes--Service会话粘性
    Service资源还支持Sessionaffinity(绘会话粘性或粘性会话)机制,它能够将来自同一个客户端的请求始终转发至同一个后端的Pod对象,所以,这就意味着它会影响调度算法的流量分发......
  • [学习笔记]darknet的部署和利用darkmark进行训练
    今天跟着学长来了解以下darknet的训练过程首先前置需求就是darknet,darkmark(可视化寻训练工具),darkhelp一、编译几个工具首先修改makefile文件GPU=1就是用gpu(不用我......
  • .NET Func与Action
    Func与Action都是系统定义好的委托(Delegate)类型,与普通的委托类型相比,Func与Action有一套封装好的方法,其中Func必须有返回值,而Action不能有返回值,因为这两个都是泛型方......
  • Lenet和卷积
      这里tensor的通道排序(batch,channel,height,width)batch就是一次传入的处理多少个图片,比如32张图片channel彩色图片的channel就是rgb三个通道,3。ps:在cifar10中的数据......
  • 【K8S】Kubernetes控制器Controller-RS/Deployment/HPA详解
    一、介绍Pod是kubernetes的最⼩管理单元,在kubernetes中,按照pod的创建方式可以将其分为两类:自主式pod:kubernetes直接创建出来的Pod,这种pod删除后就没有了,也不会重建......
  • Axiomatic Attribution for Deep Networks解读
    摘要这篇文章主要研究的是如何将模型的预测归因到模型的输入上这个问题。作者提出了两条归因方法应该满足的基本定理,敏感性(Sensitivity)和实现不变性(ImplementationIn......