c#委托与事件(详解)

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#编写简单的图形化的可发送附件的邮件客户端程序

    使用C#编写简单的图形化的可发送附件的邮件客户端程序,可以分为以下几个步骤: 步骤1:创建C#窗体应用程序 首先,打开Visual Studio,选择创建新项目,选择Windows Forms应用程序,命名为“EmailClient”,点击创建。 步骤2:添加控件 在设计视图中,选中工具箱中的各种控件,拖拽放置在窗体中进行布局设计。要实现附件发送,需要添加三…

    C# 2023年6月7日
    00
  • C# 抓取网页内容的方法

    我来为你详细讲解使用C#抓取网页内容的具体攻略。 一、准备工作 在开始之前,我们需要先引用 System.Net 名称空间,该名称空间为我们提供了一系列的网络操作类。 以下是代码示例: using System.Net; 二、HTTP请求 接下来我们需要构造一个 HTTP 请求,通过该请求来获取网页内容。通常我们抓取网页内容所用的 Http 请求类型是 Ge…

    C# 2023年5月31日
    00
  • Vue与.net Core 接收List<T>泛型参数

    Vue与.NET Core接收List泛型参数攻略 在Vue和.NET Core应用程序之间进行数据交互时,有时需要传递List泛型参数。本文将介绍如何在Vue和.NET Core应用程序之间接收List泛型参数,以及如何在Vue中使用axios库发送请求。 步骤 步骤1:在Vue中使用axios库发送请求 首先,我们需要在Vue中使用axios库发送请求。…

    C# 2023年5月17日
    00
  • C#调用百度API实现活体检测的方法

    C#调用百度API实现活体检测是一个可以应用在人脸识别等领域的重要技术。本攻略将会介绍如何使用百度AI开发平台的活体检测API,并给出两个详细的示例。 步骤一:注册百度AI开发平台 在使用百度API前,需要先注册百度AI开发平台账号,完成OAuth2.0认证。 打开百度AI开发平台首页,点击右上角“注册”按钮,创建账号。 登录账号后,进入“控制台”页面,在“…

    C# 2023年5月31日
    00
  • c# 基于Titanium爬取微信公众号历史文章列表

    C# 基于Titanium爬取微信公众号历史文章列表攻略 1. 准备工作 1.1 安装Titanium Titanium是一款爬虫框架,需要使用C#编写,因此在开始之前需要确保您已经安装了Titanium。您可以在Titanium官网下载最新版的Titanium,并根据其安装说明进行安装。 1.2 获取微信公众号的cookie 我们需要使用微信公众号的coo…

    C# 2023年5月31日
    00
  • C#中遍历各类数据集合的方法总结

    C#中遍历各类数据集合的方法总结 在C#中,有很多种不同的数据集合类型,包括列表(List)、数组(Array)、队列(Queue)、堆栈(Stack)、哈希表(Hashtable)、字典(Dictionary)等等。在实际编程过程中,我们需要遍历这些数据集合来处理数据。 本文将介绍C#中遍历各类数据集合的方法总结。 遍历列表(List) List<s…

    C# 2023年5月31日
    00
  • 在 ASP.NET Core 中使用 HTTP 标头传播详情

    在ASP.NET Core中,可以使用HTTP标头来传播请求和响应的详细信息,这对Web应用程序的开发和运行非常重要。本文将为大家提供在ASP.NET Core中使用HTTP标头传播详情的完整攻略。 HTTP标头和ASP.NET Core HTTP标头是Web请求和响应的元数据,包含有关请求和响应的信息,例如内容类型、缓存规则、认证信息等。在ASP.NET …

    C# 2023年6月3日
    00
  • CommunityToolkit.Mvvm8.1 消息通知(4)

    本系列文章导航 https://www.cnblogs.com/aierong/p/17300066.html https://github.com/aierong/WpfDemo (自我Demo地址)   希望提到的知识对您有所提示,同时欢迎交流和指正 作者:aierong出处:https://www.cnblogs.com/aierong   说明 为了…

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