委托、Lambda表达式、事件系列07,使用EventHandler委托

谈到事件注册,EventHandler是最常用的。

19
EventHandler是一个委托,接收2个形参。sender是指事件的发起者,e代表事件参数。

 

□ 使用EventHandler实现猜拳游戏

 

使用EventHandler实现一个猜拳游戏,每次出拳,出剪刀、石头、布这三者的其中一种。

 

首先抽象出一个被观察者,其中提供了事件,提供了执行事件的方法。

    public class FistGame
    {
        public string FistName { get; set; }
        public event EventHandler GuessFist;
        public void Start()
        {
            if (GuessFist != null)
            {
                GuessFist(this, EventArgs.Empty);
            }
        }
    }
 


以上,在Start方法内部调用事件GuessFist的时候,实参this代表FistGame类本身。  

 

客户端必须有一个方法和EventHandler的定义保持一致,这样才可以注册到FistGame类的EventHandler事件上。

   class Program
    {
        static void Main(string[] args)
        {
            FistGame jiandao = new FistGame(){FistName = "剪刀"};
            jiandao.GuessFist += GetFistResult;
            FistGame shitou = new FistGame() { FistName = "石头" };
            shitou.GuessFist += GetFistResult;
            FistGame bu = new FistGame() { FistName = "" };
            bu.GuessFist += GetFistResult;
            FistGame finalFist = null;
            var temp = new Random().Next()%3;
            if (temp == 0)
            {
                finalFist = jiandao;
            }
            else if(temp == 1)
            {
                finalFist = shitou;
            }
            else
            {
                finalFist = bu;
            }
            finalFist.Start();
        }
        static void GetFistResult(object sender, EventArgs e)
        {
            FistGame fistGame = sender as FistGame;
            Console.WriteLine("本次出的拳为:" + fistGame.FistName);
        }
    }
 

20  
以上,GetFistResult方法的参数列表符合EventHandler的定义,并且给每个FistGame实例的GuessFist事件注册了该方法。最后,根据随机数来决定采用哪个FistGame实例。  

 

□ 使用EventHandler传递事件参数

 

首先需要一个派生于EventArgs的类,通过构造函数注入一个枚举状态。

    public class FistGameEventArgs : EventArgs
    {
        public FistEnum CurrentFist { get; private set; }
        public FistGameEventArgs(FistEnum currentFist)
        {
            CurrentFist = currentFist;
        }
    }
    public enum FistEnum
    {
        jiandao,
        shitou,
        bu
    }
 

 

作为被观察者的FistGame来讲,现在需要EventHandler<TEventArgs>泛型来实现。

    public class FistGame
    {
        public string FistName { get; set; }
        public event EventHandler<FistGameEventArgs> GuessFist;
        public void Start()
        {
            if (GuessFist != null)
            {
                GuessFist(this, new FistGameEventArgs(FistEnum.jiandao));
            }
        }
    }
 

 

客户端,与EventHandler参数列表一致的GetFistResult方法把事件参数显示出来。   

        static void Main(string[] args)
        {
            FistGame jiandao = new FistGame(){FistName = "剪刀"};
            jiandao.GuessFist += GetFistResult;
            jiandao.Start();
        }
        static void GetFistResult(object sender, FistGameEventArgs e)
        {
            FistGame fistGame = sender as FistGame;
            Console.WriteLine("从Name属性获得,本次出的拳为:" + fistGame.FistName);
            switch (e.CurrentFist)
            {
                case FistEnum.jiandao:
                    Console.WriteLine("从事件参数获得,本次出的拳为:剪刀");
                    break;
                case FistEnum.shitou:
                    Console.WriteLine("从事件参数获得,本次出的拳为:石头");
                    break;
                case FistEnum.bu:
                    Console.WriteLine("从事件参数获得,本次出的拳为:布");
                    break;
            }
        }
    }    
 

21

 

总结:使用EventHandler委托不仅可以实现事件注册和取消,而且还可以获取事件发起者和事件参数。

 

 

“委托、Lambda表达式、事件系列”包括:

委托、Lambda表达式、事件系列01,委托是什么,委托的基本用法,委托的Method和Target属性

委托、Lambda表达式、事件系列02,什么时候该用委托

委托、Lambda表达式、事件系列03,从委托到Lamda表达式

委托、Lambda表达式、事件系列04,委托链是怎样形成的, 多播委托, 调用委托链方法,委托链异常处理

委托、Lambda表达式、事件系列05,Action委托与闭包

委托、Lambda表达式、事件系列06,使用Action实现观察者模式,体验委托和事件的区别

委托、Lambda表达式、事件系列07,使用EventHandler委托

转载于:https://www.cnblogs.com/darrenji/p/4004343.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/482498.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2022年国家自然科学基金指南发布情况

来源&#xff1a;锐动源编辑部近日&#xff0c;2022年国家自然科学基金部分项目申报指南已陆续发布。据不完全统计&#xff0c;截至目前2022年国家自然科学基金已发布32个项目的申报指南&#xff0c;其中“国家自然科学基金委员会与日本学术振兴会合作与交流项目”已发布获资助…

最简单概率论的五个智慧

来源 &#xff1a;罗辑思维在我认为人人都应该学一些概率知识&#xff0c;它现在是公民的必备知识。现在的世界比过去复杂得多&#xff0c;其中有大量不确定性&#xff0c;是否理解概率&#xff0c;直接决定一个人的开化程度。01随机&#xff1a;有些事情是无缘无故地发生的这个…

谷歌AI一次注释了10%的已知蛋白质序列,超过人类十年研究成果

来源&#xff1a;ScienceAI编辑 &#xff1a;泽南、张倩和 AlphaFold 不同&#xff0c;这次谷歌探索的是用深度学习给蛋白质打上功能标签。蛋白质是组成人体一切细胞、组织的重要成分。机体所有重要的组成部分都需要有蛋白质的参与。目前已知存在的蛋白质种类有数十亿&#xff…

20190808面试记录

Angular的核心&#xff1f; 组件&#xff0c;指令&#xff0c;服务&#xff0c;依赖注入 性能优化&#xff1f; 1、减少http请求&#xff08;图片压缩合并&#xff0c;css压缩合并&#xff0c;js文件压缩合并&#xff09; 2、检查是否有重定向问题 3、检查是否一个列表有多次请…

你真的了解计算生物学和AI for Science吗?

来源&#xff1a;量子位Q1&#xff1a;AlphaFold2的最大意义是什么&#xff1f;A1&#xff1a;这个看似突破性的进展&#xff0c;其实是技术演进的必然结果。 此外&#xff0c;如果我们换个视角来看待这个问题&#xff0c;蛋白质结构预测仅仅是计算生物学这个大门类里面一个相对…

excel字符串反转

1.新建空白sheet2.altf11调出VB3.插入-模块-填入自定义函数Function REVERSE(Str As String)REVERSE StrReverse(Str)End Function 转载于:https://www.cnblogs.com/AWNUygah/p/11350843.html

Stephen Wolfram专访Judea Pearl:从贝叶斯网络到元胞自动机

来源&#xff1a; 集智俱乐部编译&#xff1a;闫和东、徐培 编辑&#xff1a;邓一雪 导语2022年人工智能与数学国际研讨会&#xff08;ISAIM 2022&#xff09;恰逢著名计算机科学家、贝叶斯网络之父 Judea Pearl 85岁生日&#xff0c;会议期间Mathematica创始人 Stephen Wolfra…

excel常用函数

1.截取字符串函数 left&#xff08;&#xff09;   从左边截取 mid()    从中间截取 right()    从右边截取 转载于:https://www.cnblogs.com/AWNUygah/p/11350904.html

day32 并发编程之锁

并发编程之锁 1. GIL全局解释器锁 2. GIL与普通的互斥锁 3. 死锁 4. 信号量 5. event事件 6. 线程q 1. GIL全局解释器锁 """ In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytec…

马斯克Neuralink被曝“虐杀实验猴”,140万元美金项目遭谴责

来源&#xff1a; 学术头条作者&#xff1a;刘芳编辑&#xff1a;黄珊2021 年 4 月&#xff0c;马斯克公布了一段猴子用意念玩乒乓球游戏的视频&#xff0c;一时间为他旗下的脑机接口公司 Neuralink 赚足了眼球。然而最近&#xff0c;这些被用来做脑机接口实验的猴子的经历&…

死前真的会有「跑马灯」,人类首次同步测量大脑濒死状态

来源&#xff1a;新智元编辑&#xff1a;袁榭 好困或许&#xff0c;人死前可能真会眼前出现人生跑马灯&#xff01;最近&#xff0c;神经科学家在记录了一个濒临死亡的人类大脑的活动之后发现&#xff0c;人在死亡前后有节奏的脑电波模式与做梦、回忆记忆和冥想时出现的模式相似…

七牛图片盲水印

注意 暂时不支持从 dora 数据处理直接调该接口&#xff0c;只支持从 kodo 存储调用。即 cdn 域名不可开通图片瘦身调用形式 资源 http://i.iamlj.com/19-08-12/123936.png 处理参数 watermark/6/method/encode/text/aGVsbG8gcWluaXU 新图 http://i.iamlj.com/19-08-12/123936-w…

「最小细胞」的3D数字模型,计算揭示生命最基本的要求

来源&#xff1a;ScienceAI编辑&#xff1a;萝卜皮无论是海洋深处的奇异生物还是我们体内的细菌&#xff0c;地球上的所有生命都是由细胞组成的。但我们对这些细胞中最简单的细胞如何运作只有一个非常粗略的了解。伊利诺伊大学厄巴纳-香槟分校的一个团队创建了有史以来最完整的…

excel常用技巧

一、单元格内快速换行输入&#xff1a;编辑状态下AltEnter 二、单元格设置斜线分割 作为表头&#xff0c;斜线分割还是比较常用的。 1、选中单元格。 2、右键设置单元格格式。 3、在对话框中选择边框标签。 4、选中斜线选项并确定即可。 5、编辑表头&#xff0c;利用AltEnter输…

Yann LeCun最新发声:自监督+世界模型,让 AI 像人类与一样学习与推理

来源&#xff1a;AI科技评论作者&#xff1a;维克多、西西、王晔编辑&#xff1a;陈彩娴如何突破当代人工智能&#xff08;AI&#xff09;的瓶颈&#xff1f;不同学者存在不同观点。总体来看可以概括为两类&#xff0c;其一监督学习者&#xff0c;提倡通过改善数据标签质量&…

day33-进程池和线程池

进程池与线程池 开进程开线程都需要消耗资源&#xff0c;只不过两者比较的情况线程消耗的资源比较少 在计算机能够承受范围之内最大限度的利用计算机 什么是池&#xff1f; # 在保证计算机硬件安全的情况下最大限度的利用计算机 池其实是降低了程序的运行效率 但是保证了计算机…

【转】常用数学函数篇(Linux c)

abs&#xff08;计算整型数的绝对值&#xff09; 相关函数 labs, fabs 表头文件 #include<stdlib.h> 定义函数 int abs (int j) 函数说明 abs()用来计算参数j的绝对值&#xff0c;然后将结果返回。 返回值 返回参数j的绝对值结果。 范例 #ingclude <stdlib.h> main…

两大头号玩家 一个伟大愿景: 联邦学习的元生态建设美好世界

来源&#xff1a;IEEE标准协会新年伊始&#xff0c;世界领先的标准制定机构IEEE标准协会牵头&#xff0c;组织了2022年度联邦学习领域首场重量级尖峰交流活动——联邦学习首创团队带头人、谷歌研究院副总裁Blaise Agura y Arcas博士&#xff0c;与联邦学习亚洲奠基人、IEEE联邦…

物理学的过去、现在与未来

来源&#xff1a;中科院之声&#xff08;ID:zkyzswx&#xff09;、《物理》杂志、中国物理学会期刊网作者&#xff1a;冯端&#xff08;我国著名物理学家、金属和晶体材料学家、教育家&#xff0c;中国科学院院士、第三世界科学院院士、第五届中国物理学会理事长&#xff0c;南…

Android UI之困 横跨四个屏幕的战争

用户界面&#xff08;UI&#xff09;的话题&#xff0c;总是会带来强烈的争论。这有点像电视领域——每个人都是专家&#xff0c;因为每个人都是用户。早在2002年&#xff0c;电信运营商就有一套自己的UI定制界面——例如Vodafone Live 和 Orange SPV。当然&#xff0c;这遭到很…