一篇文章彻底搞清楚c#中的委托与事件

一篇文章彻底搞清楚C#中的委托与事件

委托

委托(Delegate)是一种类型,它可以持有函数的引用并执行这个函数。通过委托,我们可以在不知道函数名的情况下,直接访问和执行函数。

定义

在C#中,委托是定义在类的外部,但是要在类的内部定义具体的委托实例。委托的定义格式如下:

public delegate void DelegateName(parameters)

其中 DelegateName 就是委托的名称,而 parameters 是委托所需要的参数。

委托的使用

定义

首先,我们需要定义一个委托类型:

public delegate int MyDelegate(int a, int b);

这个委托类型可以被用来表示一个带有两个 int 类型参数并且返回值也为 int 类型的方法。

实例化

然后,我们可以通过委托类型实例化一个委托,这个委托将会执行一个方法。

public class DelegateExample
{
    public static int Add(int a, int b)
    {
        return a + b;
    }

    public static void Main()
    {
        // 实例化一个委托
        MyDelegate myDelegate = new MyDelegate(Add);

        // 使用委托执行 Add 方法
        int result = myDelegate(1, 2);
        Console.WriteLine("1 + 2 = " + result);
    }
}

在这个例子中,我们实例化了一个 MyDelegate 委托,然后通过 myDelegate 来调用 Add 方法。

委托链

委托链是一种将多个委托实例组合在一起并依次执行的方式。

添加委托

我们可以通过 += 操作符向委托链中添加委托:

public class DelegateExample
{
    public static int Add(int a, int b)
    {
        return a + b;
    }

    public static int Multiply(int a, int b)
    {
        return a * b;
    }

    public static void Main()
    {
        // 实例化两个委托
        MyDelegate addDelegate = new MyDelegate(Add);
        MyDelegate multiplyDelegate = new MyDelegate(Multiply);

        // 将委托实例添加到委托链中
        MyDelegate myDelegate = addDelegate;
        myDelegate += multiplyDelegate;

        // 依次执行委托链中的委托
        int result = myDelegate(1, 2);
        Console.WriteLine("1 + 2 * 2 = " + result);
    }
}

在这个例子中,我们定义了两个带有两个 int 类型参数并且返回值也为 int 类型的方法,然后实例化了两个 MyDelegate 类型的委托。接着我们将这两个委托实例添加到了委托链中,并依次执行了这个委托链。

移除委托

我们可以通过 -= 操作符从委托链中移除委托:

public class DelegateExample
{
    public static int Add(int a, int b)
    {
        return a + b;
    }

    public static int Multiply(int a, int b)
    {
        return a * b;
    }

    public static void Main()
    {
        // 实例化两个委托
        MyDelegate addDelegate = new MyDelegate(Add);
        MyDelegate multiplyDelegate = new MyDelegate(Multiply);

        // 将委托实例添加到委托链中
        MyDelegate myDelegate = addDelegate;
        myDelegate += multiplyDelegate;

        // 从委托链中移除委托实例
        myDelegate -= addDelegate;

        // 依次执行委托链中的委托
        int result = myDelegate(1, 2);
        Console.WriteLine("1 * 2 = " + result);
    }
}

在这个例子中,我们使用了 -= 操作符将 addDelegate 委托从委托链中移除,然后只剩下了 multiplyDelegate 委托实例。

事件

事件(Event)是一种特殊的委托,它可以在委托链中添加和移除委托实例。当事件被触发时,委托链中所有的委托实例都会被执行。

定义

在C#中,事件的定义格式如下:

public event EventHandler EventName;

其中 EventHandler 是一个预定义的委托类型,用于处理事件。

定义自定义事件处理程序

public class CustomEventArgs : EventArgs
{
    public CustomEventArgs(string s)
    {
        Message = s;
    }

    public string Message { get; set; }
}

public class EventExample
{
    public delegate void CustomEventHandler(object sender, CustomEventArgs args);

    public event CustomEventHandler CustomEvent;

    public void RaiseEvent(string message)
    {
        OnCustomEvent(new CustomEventArgs(message));
    }

    protected virtual void OnCustomEvent(CustomEventArgs e)
    {
        CustomEvent?.Invoke(this, e);
    }
}

在这个例子中,我们定义了一个 CustomEventArgs 类型,用于包含我们需要传递至事件处理程序的自定义参数。然后我们定义了一个 CustomEventHandler 委托,用于处理事件。随后我们定义了一个 CustomEvent 事件,并在 RaiseEvent 方法中触发这个事件。

由于事件只能触发委托链中的方法,因此我们需要在事件定义中使用一个委托类型,而不是使用一个具体的处理程序。然后,在 OnCustomEvent 方法中,我们调用了委托链中所有的委托实例。

注册事件

public void RegisterEvent(EventExample ex)
{
    ex.CustomEvent += CustomEventHandler1;
    ex.CustomEvent += CustomEventHandler2;
}

public void CustomEventHandler1(object sender, CustomEventArgs args)
{
    Console.WriteLine(args.Message + " from EventHandler1.");
}

public void CustomEventHandler2(object sender, CustomEventArgs args)
{
    Console.WriteLine(args.Message + " from EventHandler2.");
}

在这个例子中,我们向 EventExample 中的 CustomEvent 事件注册两个事件处理程序。当事件被触发时,CustomEventHandler1CustomEventHandler2 会被依次执行。

触发事件

public void TriggerEvent(EventExample ex)
{
    ex.RaiseEvent("This is a custom event.");
}

在这个例子中,我们通过调用 RaiseEvent 方法来触发 CustomEvent 事件。这个方法将会依次执行 CustomEventHandler1CustomEventHandler2

总结

  • 委托是一种可以持有函数引用并执行这个函数的类型。通过委托,我们可以在不知道函数名的情况下,访问和执行这个函数。
  • 委托链是一种将多个委托实例组合在一起并依次执行的方式。
  • 事件是一种特殊的委托,可以在委托链中添加和移除委托实例。当事件被触发时,委托链中所有的委托实例都会被执行。

示例

下面是一个简单的示例,演示了如何使用委托和事件:

using System;

public delegate int MyDelegate(int a, int b);

public class DelegateExample
{
    public static int Add(int a, int b)
    {
        return a + b;
    }

    public static int Multiply(int a, int b)
    {
        return a * b;
    }

    public static void Main()
    {
        // 实例化两个委托
        MyDelegate addDelegate = new MyDelegate(Add);
        MyDelegate multiplyDelegate = new MyDelegate(Multiply);

        // 将委托实例添加到委托链中
        MyDelegate myDelegate = addDelegate;
        myDelegate += multiplyDelegate;

        // 依次执行委托链中的委托
        int result = myDelegate(1, 2);
        Console.WriteLine("1 + 2 * 2 = " + result);

        // 定义事件
        EventExample ex = new EventExample();

        // 注册事件
        RegisterEvent(ex);

        // 触发事件
        TriggerEvent(ex);
    }

    public static void RegisterEvent(EventExample ex)
    {
        ex.CustomEvent += CustomEventHandler1;
        ex.CustomEvent += CustomEventHandler2;
    }

    public static void CustomEventHandler1(object sender, CustomEventArgs args)
    {
        Console.WriteLine(args.Message + " from EventHandler1.");
    }

    public static void CustomEventHandler2(object sender, CustomEventArgs args)
    {
        Console.WriteLine(args.Message + " from EventHandler2.");
    }

    public static void TriggerEvent(EventExample ex)
    {
        ex.RaiseEvent("This is a custom event.");
    }
}

public class CustomEventArgs : EventArgs
{
    public CustomEventArgs(string s)
    {
        Message = s;
    }

    public string Message { get; set; }
}

public class EventExample
{
    public delegate void CustomEventHandler(object sender, CustomEventArgs args);

    public event CustomEventHandler CustomEvent;

    public void RaiseEvent(string message)
    {
        OnCustomEvent(new CustomEventArgs(message));
    }

    protected virtual void OnCustomEvent(CustomEventArgs e)
    {
        CustomEvent?.Invoke(this, e);
    }
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一篇文章彻底搞清楚c#中的委托与事件 - Python技术站

(0)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • C#中多态现象和多态的实现方法

    下面来详细讲解一下”C#中多态现象和多态的实现方法”的攻略。 什么是多态? 多态,英文名为Polymorphism,是指在面向对象编程中,同一种行为表现出不同的形态和用途,也是一种很强大的面向对象编程特性。 在实际应用中,多态通常指的是一个变量(或参数、返回值等)能够具有多种类型,且能够根据不同的类型而呈现出多种不同的行为的能力,这种能力通常是通过继承、重载…

    C# 2023年6月7日
    00
  • Windows Server2012 安装配置DNS服务器方法详解

    下面是关于“Windows Server 2012安装配置DNS服务器方法详解”的完整攻略,包含两个示例。 1. DNS服务器简介 DNS(Domain Name System)是互联网上的一种命名系统,用于将域名转换为IP地址。DNS服务器是运行DNS服务的计算机,它负责将域名解析为IP地址。在Windows Server 2012中,可以使用DNS服务器…

    C# 2023年5月15日
    00
  • C#图片处理类分享

    C#图片处理类分享 在本文中,我们将分享一些如何使用C#图片处理类(Image class)的技巧和实用示例。这些技巧涵盖的范围包括图片压缩,大小和比例的更改,旋转和翻转图片等。 图片压缩 压缩图片可以减小图片的大小,从而减少图片在服务器上的存储空间和网络传输带宽占用。下面是一个简单的示例,演示如何使用C#的Image类来压缩图片: using System…

    C# 2023年5月31日
    00
  • Unity3D开发教程:愤怒的小鸟

    Unity3D开发教程:愤怒的小鸟 简介 愤怒的小鸟是一款极为流行的休闲游戏。玩家需要控制弹弓向敌人发射小鸟,以摧毁敌人所在的建筑物。该游戏由 Rovio Entertainment 开发,于2009年首次发布。现在,我们将通过学习 Unity3D 开发愤怒的小鸟来了解游戏开发的基础知识。 准备工作 在开始学习之前,您需要先掌握以下技术: 基础的 C# 和 …

    C# 2023年6月3日
    00
  • c# 接口interface基础入门小例子

    接下来我将为你详细讲解“C#接口interface基础入门小例子”的完整攻略。 什么是C#接口interface 接口是一种约定,它规定了某个类必须具备哪些方法和属性。接口是在C#中实现多态性的方式之一,通过接口,我们可以实现一些常用的设计模式,如工厂模式、适配器模式等。一个接口定义了一系列方法名称、参数类型和返回类型,但并不提供方法的实现。方法的实现是由具…

    C# 2023年5月31日
    00
  • C#环形缓冲区(队列)完全实现

    感谢您对C#环形缓冲区(队列)的关注。在这里,我将为您提供一份详细的攻略,让您可以快速入门并掌握C#环形缓冲区(队列)的完全实现。 简介 环形缓冲区,也称为环形队列,是一种非常重要的数据结构,它有很多应用场景,例如缓冲区、循环播放、事件队列等。 C#环形缓冲区是一种很常见的环形队列实现方式。它提供了一系列方法来方便地添加或者移除元素,以及遍历整个队列和判断队…

    C# 2023年5月15日
    00
  • c# 重载WndProc,实现重写“最小化”的实现方法

    C#中的WndProc方法是窗体消息处理方法,通过重载WndProc方法可以实现窗体事件处理的功能。在这个方法中,可以处理Windows系统的消息事件,比如最小化、最大化、移动等操作,甚至可以自定义消息事件。下面详细介绍如何通过重载WndProc方法实现重写最小化窗体的实现方法。 第一步:创建一个C#窗体应用程序,打开窗体设计器(Form1.cs),右键单击…

    C# 2023年6月3日
    00
  • net core webapi多版本控制与swagger(nswag)配置教程

    .NET Core WebAPI 多版本控制与 Swagger(NSwag)配置教程 在 .NET Core WebAPI 中,我们可以使用多版本控制来管理不同版本的 API。同时,我们也可以使用 Swagger(NSwag)来生成 API 文档和客户端代码。本攻略将介绍如何在 .NET Core WebAPI 中实现多版本控制和 Swagger(NSwag…

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