【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

相关推荐

  1. C# 一种基于 event 委托事件机制

    2024-02-20 08:58:02       13 阅读
  2. C#delegateevent,及他们区别

    2024-02-20 08:58:02       11 阅读
  3. C#委托事件

    2024-02-20 08:58:02       9 阅读
  4. delegate(委托),Event(事件),Action,Func

    2024-02-20 08:58:02       12 阅读
  5. 深入理解 C# Unity 事件委托

    2024-02-20 08:58:02       14 阅读
  6. C# 事件委托区别

    2024-02-20 08:58:02       42 阅读
  7. C# 委托Delegate

    2024-02-20 08:58:02       17 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-20 08:58:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-20 08:58:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-20 08:58:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-20 08:58:02       18 阅读

热门阅读

  1. git常用命令

    2024-02-20 08:58:02       22 阅读
  2. 百度电商“历劫”归来

    2024-02-20 08:58:02       24 阅读
  3. React 中的类组件

    2024-02-20 08:58:02       22 阅读
  4. react的different算法

    2024-02-20 08:58:02       27 阅读
  5. 【Python】图像裁剪与匹配

    2024-02-20 08:58:02       30 阅读
  6. 递归读取文件夹下的所有文件

    2024-02-20 08:58:02       28 阅读
  7. 题解

    2024-02-20 08:58:02       26 阅读
  8. GO框架基础 (二)、sqlx库

    2024-02-20 08:58:02       25 阅读
  9. Spring Boot整合Redis实现订单超时处理

    2024-02-20 08:58:02       24 阅读
  10. spring boot rabbitmq常用配置

    2024-02-20 08:58:02       27 阅读