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#中哈希表(HashTable)用法实例详解(添加/移除/判断/遍历/排序等)

    C#中哈希表(HashTable)用法实例详解 哈希表(HashTable)是一种使用哈希算法实现的数据结构,它能在平均情况下以常数时间复杂度进行基本操作(添加、删除、查找)。 在C#中,哈希表可以用System.Collections.Hashtable类实现。本文将详细介绍哈希表在C#中的用法,包括添加、移除、判断、遍历、排序等。 添加元素 使用哈希表添…

    C# 2023年6月7日
    00
  • C# 添加文字水印类代码

    下面是关于“C# 添加文字水印类代码”的完整攻略。 1. 确定需求和目标 在开始编写代码之前,我们需要明确需求和目标。本文中,我们要编写一个 C# 类,能够在一张图片上添加指定文字的水印。该类应该简单易用,具有灵活性和可扩展性,而且在添加水印时要保持图片的质量。 2. 准备开发环境 在开始编写代码之前,我们需要准备好开发环境。具体来说,我们需要安装 Visu…

    C# 2023年6月7日
    00
  • C#判断指定文件是否是只读的方法

    要判断指定文件是否为只读文件,有多种方式可以实现。下面介绍两种方法: 方法一:使用File类的GetAttributes方法及FileAttributes枚举值判断文件属性 File类提供了一些静态方法及属性,可实现对文件的基本操作功能。其中GetAttributes方法可获取文件的属性,包括只读、隐藏、系统、临时等属性。通过判断文件的属性是否包含FileA…

    C# 2023年6月1日
    00
  • .Net core Blazor+自定义日志提供器实现实时日志查看器的原理解析

    以下是使用.NET Core Blazor和自定义日志提供程序实现实时日志查看器的原理解析: 1. 什么是Blazor Blazor是一个.NET平台上的开源Web框架,它允许我们使用C#和.NET技术构建现代Web应用程序。Blazor使用WebAssembly技术,可以在浏览器中运行C#代码。 2. 什么是自定义日志提供器 在.NET Core中,我们可…

    C# 2023年5月12日
    00
  • 使用C#实现在屏幕上画图效果的代码实例

    下面是使用C#实现在屏幕上画图效果的完整攻略。 目录 准备工作 绘制线段 绘制多边形 示例说明一:绘制简单的三角形 示例说明二:绘制带填充的矩形 准备工作 在C#中,我们可以通过System.Drawing命名空间下的Graphics类来实现在屏幕上的画图效果。在使用之前,需要进行如下准备工作: 引用命名空间 using System.Drawing; 创建…

    C# 2023年6月6日
    00
  • 一篇文章彻底搞清楚c#中的委托与事件

    一篇文章彻底搞清楚C#中的委托与事件 委托 委托(Delegate)是一种类型,它可以持有函数的引用并执行这个函数。通过委托,我们可以在不知道函数名的情况下,直接访问和执行函数。 定义 在C#中,委托是定义在类的外部,但是要在类的内部定义具体的委托实例。委托的定义格式如下: public delegate void DelegateName(paramete…

    C# 2023年6月7日
    00
  • C#多线程用法详解

    C#多线程用法详解 C#支持多线程编程,可以充分利用多核CPU的性能,提高程序的性能和响应速度。本文将详细讲解C#多线程的用法。 线程的创建 C#创建线程有两种方式,一种是使用Thread类,另一种是使用ThreadPool类。 使用Thread类创建线程 使用Thread类创建线程可以获得更多的控制权,可以更灵活地控制线程的行为。 Thread threa…

    C# 2023年5月15日
    00
  • unity 文件流读取图片与www读取图片的区别介绍

    下面是“unity 文件流读取图片与www读取图片的区别介绍”的完整攻略。 什么是Unity的文件流读取图片? 在Unity中,我们可以使用文件流(FileStream)来以字节的形式读取和写入文件。读取图片也是其中的一种应用。通过使用文件流来读取图片,我们可以将图片加载到内存中,以便进行后续的处理和操作。通过文件流读取图片可以得到一张Texture2D类型…

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