一篇文章彻底搞清楚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日

相关文章

  • linq中的分组操作符

    当需要对查询结果进行分组时,我们可以使用LINQ中的分组操作符。常用的分组操作符有GroupBy、ToLookup等。 GroupBy操作符 GroupBy操作符将一个序列按照指定条件分成多个组,并返回每个组及其对应的元素集合。其语法为: IEnumerable<IGrouping<TKey, TSource>> GroupBy&lt…

    C# 2023年6月1日
    00
  • C#的自定义语法糖的使用详解

    C#的自定义语法糖的使用详解 什么是自定义语法糖? 自定义语法糖是指一种用于简化特定代码块的特殊语法。在C#中,通过定义类似于函数的“扩展方法”或者特殊的属性,可以提供更加便捷、易读的代码实现方式。 如何使用自定义语法糖? 通过编写自己的扩展方法或者属性,可以使用自定义的语法糖。以下是具体的实现步骤。 定义扩展方法 通过以下代码定义一个简单的扩展方法,用于在…

    C# 2023年6月6日
    00
  • C# 使用Microsoft Edge WebView2的相关总结

    下面是关于“C#使用MicrosoftEdgeWebView2的相关总结”的完整攻略,包含两个示例。 1. MicrosoftEdgeWebView2简介 MicrosoftEdgeWebView2是一个基于Chromium的Web浏览器控件,可以嵌入到Windows应用程序中。它提供了一组API,用于在应用程序中显示Web内容,并与Web内容进行交互。 2…

    C# 2023年5月15日
    00
  • linq中的连接操作符

    当我们在使用Linq时,有时候我们需要将两个数据源进行连接(Join)操作,LINQ提供了以下几种连接操作符: Inner Join(join in) Left Outer Join (join…into…from…DefaultIfEmpty) Right Outer Join (join…into…from…DefaultIfEm…

    C# 2023年6月1日
    00
  • C#实现动态执行字符串脚本(优化版)的示例代码

    让我来详细讲解“C#实现动态执行字符串脚本(优化版)的示例代码”的完整攻略。 首先,需要明确的是,我们要实现的目标是动态执行字符串脚本,所以需要满足以下要求: 能够将字符串解析为C#代码 能够动态地将解析出来的代码编译成程序集 能够调用编译后的程序集中的方法 针对上述要求,我们需要利用C#的编译器,通过代码生成器将字符串转为C#代码,并通过编译器将生成后的代…

    C# 2023年5月15日
    00
  • 一文带你吃透C#中面向对象的相关知识

    一文带你吃透C#中面向对象的相关知识 什么是面向对象 面向对象编程是一种编程方法和思想,它的核心是将事物抽象为对象,并通过对象之间的交互来完成任务。在C#中,一切皆为对象,包括类和结构体等用户定义的类型,以及基本类型如int,float等。 类与对象 类是创建对象的模板,它定义了对象的属性和方法。对象是类的实例,它是内存中分配的一块区域,可以存储类的属性值。…

    C# 2023年5月14日
    00
  • C#中日期时间的简单操作

    C#中日期时间的简单操作 在C#中,日期时间类型是一种非常常见的数据类型。C#提供了许多方法和属性来操作和处理日期时间,使得处理日期时间变得十分方便。接下来将介绍C#中日期时间的简单操作攻略。 获取当前时间 可以使用DateTime.Now属性来获取当前的日期时间。例如: DateTime now = DateTime.Now; 获取当前时间的各个部分 可以…

    C# 2023年5月15日
    00
  • .NET Framework 3.5 Win11无法安装怎么办 .NET Framework3.5安装教程

    如果在Windows 11上安装.NET Framework 3.5时遇到问题,可以尝试以下解决方案: 1. 使用Windows 功能启用或禁用 Windows 11中已经预装了.NET Framework 3.5,但默认情况下未启用。因此,可以尝试使用Windows 功能启用或禁用来启用.NET Framework 3.5。以下是步骤: 打开“控制面板”并…

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