c#委托与事件(详解)

yizhihongxing

C#委托与事件(详解)

什么是委托?

在C#中,委托是一个类,用于指向和调用一个或多个方法。可以将委托看做是方法的类型。通过委托,我们可以在运行时确定要调用哪个方法,而无需提前确定调用哪个方法。

如何定义委托?

在C#中,委托的定义非常简单,只需使用delegate关键字即可。

delegate 返回类型 委托名称(参数列表);

其中,

  • 返回类型:委托指向方法的返回值类型;
  • 委托名称:定义的委托名称;
  • 参数列表:委托指向方法的参数列表。

委托名称可以自定义,建议名称要见名知意。例如,要定义一个委托来作为一个方法的回调函数,可以这样写:

delegate void Callback(string arg1, int arg2);

如何使用委托?

定义了一个委托之后,就可以使用它来指向方法了。委托指向方法的语法为:

委托名称 变量名称 = new 委托名称(方法名);

其中,

  • 委托名称:先前定义的委托名称;
  • 变量名称:委托变量的名称;
  • 方法名:要指向的方法的名称。

例如,要使用上文定义的Callback委托来指向一个名为DoSomething的方法,可以这样写:

Callback callback = new Callback(DoSomething);

在这个例子中,DoSomething方法的定义如下:

void DoSomething(string arg1, int arg2)
{
    Console.WriteLine("DoSomething called! arg1 = {0}, arg2 = {1}", arg1, arg2);
}

然后,我们可以使用callback委托变量来调用DoSomething方法,如下所示:

callback("hello", 123);

什么是事件?

在C#中,事件是一种特殊的委托,它代表了一组在对象上发生的动作或操作。当事件在对象上触发时,订阅者(或观察者)将收到通知,并有机会执行相应的动作或操作。

如何定义事件?

在C#中,事件的定义遵循以下模式:

public event 委托名称 事件名称;

其中,

  • public:事件的访问修饰符,用于控制事件的可见性;
  • event:事件关键字;
  • 委托名称:前面定义的委托名称,用于指定事件的处理程序类型;
  • 事件名称:事件的名称。

例如,要定义一个事件来处理一个名为EventName的事件,可以这样写:

public event EventHandler EventName;

在这个例子中,使用了C#内置的EventHandler委托类型,它具有以下签名:

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

在事件发生时,触发事件的对象会将自己作为sender参数传递给事件处理程序,同时生成一个EventArgs实例作为e参数传递给事件处理程序。

如何订阅事件?

订阅事件是指将一个或多个方法注册为事件处理程序,以便在事件发生时能够接收通知并执行相应的操作。

在C#中,可以使用以下语法来订阅事件:

对象实例.事件名称 += 事件处理程序方法;

其中,

  • 对象实例:触发事件的对象实例;
  • 事件名称:要订阅的事件名称;
  • 事件处理程序方法:一个能够响应事件的方法。

例如,要订阅上文定义的EventName事件,可以这样写:

obj.EventName += new EventHandler(EventHandlerMethod);

在这个例子中,EventHandlerMethod是一个能够响应EventName事件的方法,定义如下:

void EventHandlerMethod(object sender, EventArgs e)
{
    Console.WriteLine("Event has occurred!");
}

EventName事件发生时,EventHandlerMethod方法将被调用。

如何触发事件?

在C#中,可以使用以下语法来触发事件:

事件名称?.Invoke(发送事件的对象, EventArgs实例);

其中,

  • 事件名称:要触发的事件名称;
  • 发送事件的对象:触发事件的对象实例;
  • EventArgs实例:事件参数。

例如,要触发上文定义的EventName事件,可以这样写:

EventName?.Invoke(this, EventArgs.Empty);

this表示当前对象实例,EventArgs.Empty表示没有任何事件数据。

示例1:使用委托实现函数指针

在这个示例中,我们将演示如何使用委托来实现函数指针。

using System;

namespace Demo1
{
    delegate void Callback();

    class Program
    {
        static void Main(string[] args)
        {
            Callback callback = new Callback(SayHello);
            callback();
        }

        static void SayHello()
        {
            Console.WriteLine("Hello World!");
        }
    }
}

在这个示例中,我们定义了一个Callback委托类型,它能够指向没有参数、没有返回值的方法。然后,我们创建了一个callback委托变量,并将它指向一个名为SayHello的方法。最后,我们使用callback委托变量来调用SayHello方法。

示例2:使用事件处理程序

在这个示例中,我们将演示如何使用事件处理程序在不同对象之间通信。

using System;

namespace Demo2
{
    public class Button
    {
        public event EventHandler Click;

        public void OnClick()
        {
            Click?.Invoke(this, EventArgs.Empty);
        }
    }

    public class MainForm
    {
        private Button button;

        public MainForm()
        {
            button = new Button();
            button.Click += new EventHandler(ButtonClick);
        }

        private void ButtonClick(object sender, EventArgs e)
        {
            Console.WriteLine("Button clicked!");
        }

        public void Run()
        {
            button.OnClick();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            MainForm mainForm = new MainForm();
            mainForm.Run();
        }
    }
}

在这个示例中,我们定义了两个类,一个名为Button,另一个名为MainFormButton类有一个名为Click的公共事件,表示当按钮被点击时发生的事件。MainForm类将Button实例化,并订阅了Click事件。

MainForm类的ButtonClick方法中,打印了“Button clicked!”的文本。在MainForm类的Run方法中,OnClick方法被调用,从而触发Click事件。因为MainForm已经订阅了Click事件,并且已经实现了ButtonClick方法,所以在按钮被单击时,它将打印“Button clicked!”的文本。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c#委托与事件(详解) - Python技术站

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

相关文章

  • C#实现MySQL命令行备份和恢复

    下面是详细讲解“C#实现MySQL命令行备份和恢复”的完整攻略。 简介 在MySQL中,备份数据和恢复数据都是非常重要的操作,它们能够保证数据在遭遇意外情况时的安全,帮助我们从容应对可能出现的数据丢失、损坏等问题。这里,我们将通过C#来实现MySQL的备份和恢复操作。 备份MySQL数据 步骤一:安装MySQL命令行工具 在开始备份之前,我们需要先安装MyS…

    C# 2023年6月2日
    00
  • 详解Unity 实现语音识别功能

    详解Unity实现语音识别功能 1. 简介 本文将介绍如何使用Google Cloud Platform中的语音识别API实现Unity中的语音识别功能。语音识别是一项较为先进的技术,能够帮助我们更快捷地输入文字和指令,提高用户体验。Unity目前已经支持语音识别的插件,其中Google Cloud语音识别API是一种流行的实现方式。 2. 准备工作 在开始…

    C# 2023年5月15日
    00
  • vs2015浮点数计算怎么提高数据精度?

    想要提高VS2015中浮点数计算的数据精度,可以尝试以下几种方法: 1.使用高精度浮点数库 在C++标准库中,对于浮点数计算,可使用<boost/multiprecision>库中的高精度浮点数类型cpp_dec_float类进行计算。该类使用了基于任意精度算法的十进制算术来进行精度计算。下面是一个示例: #include <boost/m…

    C# 2023年6月6日
    00
  • 从ASP.NET得到Microsoft Word文档的代码

    要从ASP.NET得到Microsoft Word文档,可以采用以下几个步骤: 使用C#代码生成需要的word文件内容,可以使用第三方库如NPOI或EPPlus,也可以使用Word应用程序库。 示例1:使用NPOI创建一个简单的word文件 using NPOI.XWPF.UserModel; using System.IO; public void Cre…

    C# 2023年5月31日
    00
  • c#异步操作async await状态机的总结(推荐)

    关于”c#异步操作async await状态机的总结(推荐)”这篇文章,我们首先需要了解一些基础知识。 什么是异步操作? 异步操作通常是指当一个操作(例如读取文件或从数据库中检索数据)正在执行时,代码不会阻塞(即等待该操作完成后才继续执行),而是在操作执行的同时继续执行其他代码。异步操作对于UI线程来说尤为重要,因为我们不希望用户界面因为耗时的操作而变得不响…

    C# 2023年6月6日
    00
  • 描述C#多线程中lock关键字的使用分析

    下面是“描述C#多线程中lock关键字的使用分析”的完整攻略。 Lock关键字的作用 在C#多线程编程中,我们经常需要使用共享资源,例如某个数据结构,多线程并发访问这个数据结构是不可避免的,这时候就需要通过控制临界区域来避免多个线程同时访问同一份数据造成的竞态条件问题。Lock关键字就是用来实现线程同步的机制,保障了程序在并发情况下的安全性。 Lock关键字…

    C# 2023年5月15日
    00
  • C#中WPF内存回收与释放LierdaCracker的实现

    C#中WPF内存回收与释放LierdaCracker的实现 在C# WPF应用程序中使用LierdaCracker实现内存回收和释放是非常重要的。下面将详细讲解如何实现这一过程。 为什么需要内存回收和释放 随着应用程序的运行,许多对象和资源被创建和使用。这些对象和资源需要被及时回收和释放,以确保应用程序占用的内存空间不会增长到无法控制的程度。内存回收和释放可…

    C# 2023年6月6日
    00
  • C# File.ReadAllText()方法: 读取指定文件的所有文本

    C#中的File.ReadAllText()函数 在C#语言中,File类中提供了一个ReadAllText()函数,用于读取指定文件的所有内容。 函数语法 File.ReadAllText(string path); path : 要读取的文件路径。 函数作用 File.ReadAllText()函数将读取指定路径的文件的所有内容,并将其作为字符串返回。 …

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