当前位置: 首页 > news >正文

【C#小知识】c#中的delegate(委托)和event(事件)

        今天来介绍一下delegate和event。delegate在c#中可以定义一个函数类型,可以将函数作为一个对象来使用。event在c#中则可以看做一个函数的集合,event中包含了一个或多个函数。

delegate

using System;public class MyClass
{//定义委托public delegate void EventHandler(string pParameter);//委托对象public EventHandler handler = null;public void Main(){handler = TestFunction;handler("Hello World");}private void TestFunction(string pParameter){Console.WriteLine("pParameter is " + pParameter);}
}

        如上代码,定义委托关键字“delegate”,委托的定义包含委托返回值、委托名称、委托参数。定义了委托类型之后,就可以声明委托对象了。EventHandler就是定义的委托类型,handler则是声明的委托对象。

        在使用过程中就可以将函数TestFunction赋值给handler,这里需要注意的是委托的返回值和参数必须和赋值函数的返回值和参数一致,否则编译器则会提示错误。在使用时像普通的函数调用一样使用即可。

event

using System;public class MyClass
{public delegate void EventHandler(string pParameter);public event EventHandler handler = null;public void Main(){handler += HelloWorld;handler += GoodMorning;handler("");handler -= GoodMorning;handler?.Invoke("");/*输出结果* This is HelloWorld* This is GoodMorning* This is HelloWorld*/}private void HelloWorld(string pParameter){Console.WriteLine("This is HelloWorld");}private void GoodMorning(string pParameter){Console.WriteLine("This is GoodMorning");}
}

        如上代码,使用关键字“event”来定义事件,这里的handler已经不是委托对象了,而是事件对象,事件的类型依然是委托类型。和委托对象不同,事件对象可以包含多个函数,通过+=运算符来进行添加函数。如果需要从事件中去除某个函数,则可以通过-=运算符来移除函数。

        事件除了可以像普通函数一样通过()括号的方式调用,也可以通过Invoke方法进行调用。作者个人比较喜欢用Invoke方法进行调用,这样可以使用条件运算符“?”来进行判断事件是否为空。

官方文档连接

delegate文档连接:https://learn.microsoft.com/zh-cn/dotnet/csharp/delegate-class

event文档连接:https://learn.microsoft.com/zh-cn/dotnet/csharp/programming-guide/events/how-to-subscribe-to-and-unsubscribe-from-events

http://www.lryc.cn/news/307646.html

相关文章:

  • 车规级存储芯片SPI NOR Flash
  • CSS轻松学:简单易懂的CSS基础指南
  • 06 Qt自绘组件:Switch动画开关组件
  • 大语言模型LLM分布式训练:大规模数据集上的并行技术全景探索(LLM系列03)
  • 98.验证二叉搜索树
  • 2月21日,每日信息差
  • android.text.BoringLayout.isBoring 的 NullPointerException
  • C++ 高频考点
  • Ubuntu安装SVN服务并结合内网穿透实现公网访问本地存储文件
  • 2月20日,每日信息差
  • Visual Studio清单作用
  • Java中的==和equals()方法的区别是?hashCode()和equals()的关系是什么?
  • yaml-cpp开源库使用
  • 【C++私房菜】序列式容器的迭代器失效问题
  • MySQL 篇-深入了解 DML、DQL 语言(二)
  • 端智能:面向手机计算环境的端云协同AI技术创新
  • PHP函数 “password_hash“ 哈希密码
  • 第十一天-Excel的操作
  • 【java任意文件漏洞修复,使用文件魔数解决】
  • LeetCode 热题 100 | 二叉树(二)
  • mini-spring|定义标记类型Aware接口,实现感知容器对象
  • 83. 删除排序链表中的重复元素
  • 贪心算法
  • MySQL基本知识
  • Vue3 (unplugin-auto-import自动导入的使用)
  • 【漏洞复现】大华智慧园区综合管理平台信息泄露漏洞
  • JavaScript的书写方式
  • 第二十篇-推荐-纯CPU(E5-2680)推理-llama.cpp-qwen1_5-72b-chat-q4_k_m.gguf
  • CSS常见选择器
  • [LWC] Components Communication