首页 > 其他分享 >在控制台下使用委托和事件

在控制台下使用委托和事件

时间:2023-12-18 16:45:43浏览次数:29  
标签:定义 委托 come SaySomething 事件 台下 方法

我们都知道,C#中有“接口”这个概念,所谓的“接口”就是定义一套标准,然后由实现类来具体实现其中的方法,所以说“接口,是一组类的抽象”。同样道理,我们可以将“委托”理解为“方法的抽象”,也就是说定义一个方法的模板,至于这个方法具体是怎么样的,就由方法自己去实现。   我们知道接口的最大好处就是可以实现多态,同理,“委托”是可以实现方法的多态,当我们想调用某个具体方法的时候,我们不直接调用这个方法,而是去调用这个委托。当然,我们必须在具体方法和委托之间建立某种关联。   下面我们来看例子。   首先,我们定义一个委托:   public delegate void SaySomething(string name);   这跟抽象方法的语法格式很相似,只是多了一个关键字delegate。既然是对方法的一种抽象,那么我们最关注的当然就是方法的返回值以及方法的参数了。所以上面红色的部分就是我们定义出来的一个规矩,如果某个方法想委托我去做事,那么请你遵循我的规矩,就是返回值为void,参数为一个字符串。我们这个委托的含义是,当某个人来了,就向他说点东西。   好,既然我们已经定义了这个规矩,下面我们就定义具体的方法了。   public void SayHello(string name) { Console.WriteLine("Hello," + name + "!"); }   public void SayNiceToMeetYou(string name) { Console.WriteLine("Nice to meet you," + name + "!"); }   我们这里一共定义了两个方法,一个是向某人说Hello,另一个是向某人说Nice to meet you。我们看到,这里定义的两个方法的返回值和参数跟我们前面定义的“委托”是一致的。   接下来,我们来看事件。   public event SaySomething come;   我们定义了一个事件,这个事件是“有人来了”,注意定义的时候我们使用event关键字,除此之外,我们还加上了前面定义的“委托”的名字。这个意思是说,我这个事件只会跟“SaySomething”打交道,并且,当我这个事件发生的时候,我会通知关注我的这些“委托”(再由这些“委托”去调用具体的方法)。   我们来定义一个测试方法:   public void test() { SaySomething sayhello = new SaySomething(SayHello); SaySomething saynice = new SaySomething(SayNiceToMeetYou); come += sayhello; come += saynice; come("张三"); }   方法体中的前面两行是用来实例化委托,注意我们用到了new关键字,就好像实例化一个类一样,然后传入一个参数,但这个参数不是string类型、也不是int类型,而是一个方法名。   再下面两行就是将委托加到事件上,意思是说,如果你这个事件发生了,就告诉我一声。可以通过“+=”来将n个委托实例加到某个事件上,一旦这个事件发生,所有的这些委托实例都会得到通知。   最后一行是触发一个事件,注意我们是直接用一个事件名,然后跟一个参数,这又跟“委托”中定义的那个规矩一致(即,要有一个string类型的参数)。   最后运行一下   static void Main(string[] args) { Program program = new Program(); program.test(); Console.Read(); }     我们回过头来再看一下“事件”的定义:   public event SaySomething come;   这里已经指出了“委托”的名字,所以,我们可以直接将方法加到事件上,而省略“委托”的实例化过程,因此上面的test()方法可以简单写为:   public void test() { come += SayHello; come += SayNiceToMeetYou; come("张三"); } 总结:1定义i委托委托 2实例化委托,传入方法名 3调用实例化后的委托

标签:定义,委托,come,SaySomething,事件,台下,方法
From: https://www.cnblogs.com/xuexz/p/17911592.html

相关文章

  • 如何理解委托?
    委托是一个类,定义了方法的类型,使一个方法可以作为另一个方法的参数传递,程序具有更好的可扩展性。举个栗子,有一家红娘机构,提供委托找对象的服务,其中有一个服务套餐叫ObjectClassDelegate,可以指定身高和收入,回去之后红娘找到了再告诉你有几个符合你的要求。protecteddelegatei......
  • 十三、组件-通用属性-点击事件
    组件是构建页面的核心,每个组件通过对数据和方法的简单封装,实现独立的可视、可交互功能单元。组件之间相互独立,随取随用,也可以在需求相同的地方重复使用。@Entry@ComponentstructClick{@Statetext:string=''build(){Column(){Row({space:20}){......
  • cesium.js入门基础教程四(事件)
    事件简介Cesium中大的事件按照类型进行分类,可以分为如下几种:鼠标键盘事件相机事件数据加载事件场景加载事件 按照事件的使用方式进行分类,可以分为如下两种:创建事件处理器Handler并指定事件触发类型定义事件,如与鼠标键盘事件相关的屏幕空间事件处理器ScreenSpaceEventH......
  • 董宇辉小作文事件给我们的血泪教训【江湖险恶】
    相信大家这几天被董宇辉事件刷屏了,透彻的说就是几个关键词:功高盖主去董宇辉卸磨杀驴飞鸟尽良弓藏大家都知道新东方的转型成功(打着助农的旗号),董宇辉发挥了巨大作用,很多人也是通过董宇辉才认识了东方甄选,让东方甄选一跃成为抖音前三名的带货直播间。就在直播间蒸蒸日上的时候......
  • 董宇辉小作文事件给我们的血泪教训【江湖险恶】
    相信大家这几天被董宇辉事件刷屏了,透彻的说就是几个关键词:功高盖主去董宇辉卸磨杀驴飞鸟尽良弓藏大家都知道新东方的转型成功(打着助农的旗号),董宇辉发挥了巨大作用,很多人也是通过董宇辉才认识了东方甄选,让东方甄选一跃成为抖音前三名的带货直播间。就在直播间蒸蒸日上的时......
  • 多按钮触发事件
     usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;namespaceWindowsFormsApp1{publicpartialc......
  • c#事件订阅和注册
    最典型的事件例子,猫叫了(事件源),老鼠跑了(事件订阅者),惊醒主人(事件订阅者)源代码:1classProgram2{3staticvoidMain(string[]args)4{5Catcat=newCat();67cat.catEvent+=Mouse;//订阅猫事件8cat.catEvent+=Perso......
  • [CSharpTips]C# 控制台程序屏蔽关闭按钮,关闭快速编辑模式,注册关闭事件
    C#控制台程序屏蔽关闭按钮,关闭快速编辑模式,注册关闭事件usingSystem;usingSystem.Collections.Generic;usingSystem.Diagnostics;usingSystem.IO;usingSystem.Linq;usingSystem.Runtime.InteropServices;usingSystem.Text;usingSystem.Threading;usingSystem.......
  • 信号量、事件组、任务通知:异同及替代应用分析(超细)
    在实时嵌入式系统中,信号量、事件组和任务通知是常用的同步与通信机制,它们在不同场景下有着各自的优势与适用性。本文将深入探讨这三种机制的异同,分析它们的特点及何时可以相互替代,并通过详细的代码演示展示它们的具体应用。1.信号量(Semaphore)1.1特点计数型:信号量是一种计数型的......
  • 消息队列和事件循环
    每个渲染进程都有一个主线程,并且主线程非常繁忙,既要处理DOM,又要计算样式,还要处理布局,同时还需要处理JavaScript任务以及各种输入事件。要让这么多不同类型的任务在主线程中有条不紊地执行,这就需要一个系统来统筹调度这些任务,这个统筹调度系统就是消息队列和事件循环系统。但并不......