详解C#中delegate/event/EventHandler/Action/Func的使用和区别

详解C#中delegate/event/EventHandler/Action/Func的使用和区别

在C#中,delegate、event、EventHandler、Action和Func都是用来处理委托(delegate)的。虽然它们的作用都相似,但是它们之间有一些区别,本篇文章将对这些区别进行详细解释。

delegate和event的基础知识

delegate是C#中的一种类型,它可以用来定义方法的签名。delegate定义的方法可以被多次调用,就像C++中的函数指针一样。我们可以用delegate声明一个方法,然后把其他方法绑定到该delegate上。这样,当该delegate被调用时,所有绑定到它上面的方法都会被依次调用。

下面是一个delegate的示例:

public delegate int Calculate(int x, int y);

上述代码定义了一个delegate类型Calculate,它接受两个int类型的参数,返回一个int类型的值。

event是一种特殊类型的委托,它允许一个类的实例向外部通知事件已经发生。例如,一个按钮被点击时,它将引发一个单击事件。当这个事件发生时,处理事件的代码将被执行。类可以定义事件,而对象可以响应事件。当事件发生时,类可以向所有注册了该事件的对象发送通知。

下面是一个event的示例:

public class MyClass
{
    public delegate void MyEventHandler(object sender, EventArgs e);
    public event MyEventHandler MyEvent;

    public void RaiseEvent()
    {
        MyEvent?.Invoke(this, EventArgs.Empty);
    }
}

上述代码中,我们首先定义了一个delegate类型MyEventHandler。然后,我们定义了一个事件MyEvent,并将其绑定到MyEventHandler类型的委托上。最后,我们定义了一个方法RaiseEvent来引发事件。

EventHandler、Action和Func的用法

EventHandler是C#内置的一种delegate类型,用来处理事件。它的定义如下:

public delegate void EventHandler(object sender, EventArgs e);

EventHandler只接受两个参数,一个是事件发生的对象,另一个是事件数据。如果事件不需要传递数据,我们可以使用EventArgs.Empty传递一个空EventArgs对象。

下面是一个使用EventHandler的示例:

public class MyClass
{
    public event EventHandler MyEvent;

    public void RaiseEvent()
    {
        MyEvent?.Invoke(this, EventArgs.Empty);
    }
}

public class Program
{
    static void MyEventHandler(object sender, EventArgs e)
    {
        Console.WriteLine("Event handled!");
    }

    static void Main(string[] args)
    {
        MyClass obj = new MyClass();
        obj.MyEvent += MyEventHandler;

        obj.RaiseEvent();
    }
}

上述代码中,我们先定义了一个MyClass类,它包含一个事件MyEvent。当这个事件发生时,我们通过MyEventHandler方法来处理它。在Main函数中,我们创建一个MyClass对象,将它的事件处理程序绑定到MyEventHandler方法上,然后通过RaiseEvent方法来引发事件。当事件被触发时,我们会看到“Event handled!”这个消息。

Action和Func都是委托类型,它们可以用来直接封装一个方法。Action和Func都是泛型类型,它们的方法参数和返回值都由泛型参数来确定。例如,假设我们有一个带两个int类型参数、返回一个int类型的方法,我们可以使用Func来封装这个方法:

public static int MyMethod(int x, int y)
{
    return x + y;
}

public static void Main(string[] args)
{
    Func<int, int, int> func = MyMethod;
    int result = func(1, 2);
    Console.WriteLine(result);
}

上述代码中,我们定义了一个MyMethod方法,它接受两个int类型的参数,返回一个int类型的值。我们使用Func来定义一个委托类型,它接受两个int类型的参数,返回一个int类型的值。然后,我们将MyMethod方法赋给了这个委托类型的实例。最后,我们通过调用这个委托类型的实例来调用MyMethod方法,获得了结果并输出。

Action与Func类似,只不过Action不返回任何值。例如,我们可以用Action来封装一个只有一个int类型参数的方法:

public static void MyMethod(int x)
{
    Console.WriteLine(x);
}

public static void Main(string[] args)
{
    Action<int> action = MyMethod;
    action(1);
}

上述代码中,我们定义了一个MyMethod方法,它接受一个int类型的参数,返回一个void类型。我们使用Action来定义一个委托类型,它接受一个int类型的参数,返回一个void类型。然后,我们将MyMethod方法赋给了这个委托类型的实例。最后,我们通过调用这个委托类型的实例来调用MyMethod方法,输出了1。

总结

在C#中,delegate、event、EventHandler、Action和Func都是用来处理委托的。它们之间的主要区别在于:

  • delegate是C#中的一种类型,它可以用来定义方法的签名。
  • event是一种特殊类型的委托,它允许一个类的实例向外部通知事件已经发生。
  • EventHandler是C#内置的一种delegate类型,用来处理事件。
  • Action和Func是委托类型,它们可以被用来直接封装一个方法。Action不返回值,Func返回值。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解C#中delegate/event/EventHandler/Action/Func的使用和区别 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • C# 使用WPF 用MediaElement控件实现视频循环播放

    下面是关于“C#使用WPF用MediaElement控件实现视频循环播放”的完整攻略,包含两个示例。 1. WPF和MediaElement控件简介 WPF是一种用于创建Windows桌面应用程序的技术,它提供了一种基于XAML的用户界面设计语言。MediaElement控件是WPF中的一个控件,它可以用于播放音频和视频文件。 2. 使用MediaEleme…

    C# 2023年5月15日
    00
  • C# Linq的Skip()方法 – 跳过序列中指定数量的元素并返回剩余元素

    当使用LINQ(C# language integrated query)对集合进行查询时,我们经常需要对查询结果进行排序、筛选、分组和投影等操作。而 Skip() 方法是其中一个很有用的操作之一。 一、Skip()方法的概述 Skip() 方法是用来跳过指定数量的元素并返回剩余元素的 LINQ 方法。Skip() 方法跳过序列中的从头开始的指定数量的元素,…

    C# 2023年4月19日
    00
  • ASP.NET MVC学习教程之Razor语法

    一、什么是Razor语法? Razor语法是ASP.NET MVC中常用的视图引擎之一,它是一种轻量级模板语法,可以让开发者更方便地生成HTML代码以及与之相关的代码逻辑。Razor语法可以在ASP.NET Web Pages、ASP.NET MVC、ASP.NET Web API和ASP.NET Core等多个平台上使用。 二、如何在ASP.NET MVC…

    C# 2023年5月31日
    00
  • 微信开放平台之网站授权微信登录功能

    微信开放平台之网站授权微信登录功能 在网站开发中,我们常常需要用户登录鉴权功能。使用微信登录已经成为了一种非常方便且广泛应用的方式。本文将介绍如何使用微信开放平台实现网站授权微信登录功能。 1. 注册开发者账户 在 微信开放平台官网 注册一个开发者账户,创建一个新的应用。在应用的基本配置中,获取到AppID和AppSecret两个参数,它们将用于后续开发流程…

    C# 2023年5月31日
    00
  • CPU占用率高的N种原因

    首先我们来详细讲解下“CPU占用率高的N种原因”的完整攻略。 简介 CPU占用率高通常意味着系统资源的占用比较高,导致系统出现卡顿、卡死、运行缓慢等问题。对于软件开发与运维工程师来说,了解高CPU占用率的原因,是进行系统性能调优的基础。 N种原因 下面我们列举了高CPU占用率的N种原因,其中包括: 程序死循环 进程/线程阻塞 垃圾回收 高负载 CPU过热 接…

    C# 2023年6月7日
    00
  • C#适用于like语句的SQL格式化函数

    当我们在使用SQL语句查询一些字符串字段时,经常使用like语句进行模糊匹配。而在使用C#编写的程序中,我们通常需要将查询结果装载到某个类中,以便于后面的数据处理。这时,如果采用了字符串拼接的方式生成SQL语句,不仅不够安全,而且也不方便后续的操作,此时我们就需要借助“C#适用于like语句的SQL格式化函数”来处理SQL语句。 Step 1. 安装Dapp…

    C# 2023年6月7日
    00
  • ASP.NET Core MVC 从入门到精通之数据库

    随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NET Core MVC 系统开发的人员。 经过前几篇文章的讲解,初步了解ASP.NET Core MVC项目创建,启…

    C# 2023年4月27日
    00
  • C#基础之异步调用实例教程

    C#基础之异步调用实例教程 本篇教程旨在介绍基于C#异步调用相关知识的实例,帮助初学者了解如何利用异步调用提高程序的并发处理能力和性能。 异步调用的概念和优势 异步调用的核心是多线程并发处理。在进行某些耗时操作时,使用异步调用可以使主线程不需要等待操作完成,而可以继续执行其他操作。一般来说,异步调用可优化的操作包括网络请求、数据库请求、文件读写等等。 异步调…

    C# 2023年6月7日
    00
合作推广
合作推广
分享本页
返回顶部