详解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#.net实现在Winform中从internet下载文件的方法

    C#语言是一个功能强大的编程语言,它可以实现在Winform中从internet下载文件。本文将介绍如何使用C#.net编程语言实现Winform中下载文件的方法。本文的讲解过程分为以下四步: 使用HttpWebRequest连接到internet并下载文件 创建下载进度条 保存下载文件 报告下载进度 下面详细讲解每一步的实现方法。 第一步 使用HttpWe…

    C# 2023年6月1日
    00
  • C#中隐式运行CMD命令行窗口的方法

    要在C#中隐式地运行CMD命令行窗口,可以使用System.Diagnostics命名空间中的Process类。下面是实现的步骤: 第一步:添加命名空间 我们需要添加System.Diagnostics命名空间。可以在代码开头添加以下语句: using System.Diagnostics; 第二步:创建Process对象 Process类提供了许多方法和属…

    C# 2023年6月7日
    00
  • 前端构建 Less入门(CSS预处理器)

    前端构建 Less入门(CSS预处理器) CSS预处理器是一种把CSS编写过程中所需要的变量、混合(类似于函数)、继承等操作实现的一种技术。当我们大规模开发Web前端项目时,使用CSS预处理器可以提高CSS代码的复用性和可维护性。 Less是一种广泛使用的CSS预处理器,本文将介绍Less的基本使用方法和常用功能。 安装Less 在使用Less之前,需要首先…

    C# 2023年6月6日
    00
  • ASP.NET笔记之 Httphandler的操作详解

    ASP.NET笔记之 Httphandler的操作详解。 什么是Httphandler? Httphandler(处理程序)是ASP.NET处理请求的一个模块,可以实现自定义的请求处理逻辑。Httphandler是ASP.NET MVC中请求和响应的核心组件之一,它可以拦截请求并对其进行某些操作,比如从数据库中读取数据然后呈现在页面上。 创建和注册Httph…

    C# 2023年6月3日
    00
  • C#6 null 条件运算符

    C#6的null条件运算符(?.)是一种用于简化访问对象成员的语法糖。它主要用于避免在链式调用中出现空引用异常(NullReferenceException)。下面是使用该运算符的两个示例: 示例一:在引用可空类型时使用null条件运算符 假设我们有这样一个类: public class Person { public string Name { get; …

    C# 2023年5月15日
    00
  • ASP.NET 返回随机数实现代码

    ASP.NET 返回随机数实现代码的完整攻略如下: 1. 生成随机数 可以使用 Random 类来生成伪随机数。在 ASP.NET 中,可以使用以下代码来生成一个介于 0 到 10 之间的随机整数: Random rand = new Random(); int randomNumber = rand.Next(0, 11); 这里,我们首先创建了一个 Ra…

    C# 2023年5月31日
    00
  • C# BinaryReader.Read – 读取基本数据类型

    BinaryReader.Read 方法的作用 BinaryReader 是一个用于读取二进制数据的类。它提供了不同数据类型的读取方法,其中就包括了 Read 方法。 BinaryReader.Read 方法的作用是:从当前流中读取任意类型的数据。此方法从流中读取一个或多个字节,而每个字节都用来构建指定类型的值。 使用方法攻略 为正确使用 BinaryRea…

    C# 2023年4月19日
    00
  • asp.net中资源文件的使用

    当我们开发ASP.NET应用程序时,使用多语言资源文件是一种良好的实践。本文将为你介绍ASP.NET应用程序中资源文件的用法。 资源文件的定义和分类 资源文件是什么? 资源文件(Resource File)是指保存一个或多个文本字符串、图像、音频或其他类型数据的文本文件。 .NET Framework 提供了一种能够以有组织的方式存储、访问和管理资源的方式,…

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