首页 > 编程语言 >深入理解C#中的事件与委托

深入理解C#中的事件与委托

时间:2024-07-22 21:26:00浏览次数:13  
标签:委托 C# void Process 深入 事件 ProcessBusinessLogic public

在C#编程中,事件和委托是实现事件驱动编程的核心概念。它们使得代码更加灵活和模块化,使得不同模块之间可以通过发布和订阅事件进行通信。在这篇博客中,我们将详细探讨C#中的事件和委托,并通过示例代码来展示它们的实际应用。

委托

委托是类型安全的函数指针,它允许我们将方法作为参数进行传递。委托定义了一种方法签名,因此可以指向任何具有相同签名的方法。

定义和使用委托

首先,我们来看一个简单的委托示例:

public delegate void NotifyEventHandler(string message);

public class ProcessBusinessLogic
{
    public void Process(NotifyEventHandler notifyEventHandler)
    {
        Console.WriteLine("Process Started!");
        // 模拟一些处理工作
        System.Threading.Thread.Sleep(3000);
        // 处理完成后调用委托
        notifyEventHandler("Process Completed Successfully");
    }
}

public class Program
{
    static void Main(string[] args)
    {
        ProcessBusinessLogic processBusinessLogic = new ProcessBusinessLogic();
        processBusinessLogic.Process(ProcessCompletedHandler);

        Console.ReadKey();
    }

    private static void ProcessCompletedHandler(string message)
    {
        Console.WriteLine(message);
    }
}

在这个示例中:

  1. NotifyEventHandler 是一个委托类型,指向一个接受字符串参数并返回 void 的方法。
  2. ProcessBusinessLogic 类中,我们定义了一个 Process 方法,该方法接受一个 NotifyEventHandler 类型的参数。
  3. Main 方法中,我们实例化 ProcessBusinessLogic 并调用 Process 方法,传递 ProcessCompletedHandler 作为委托。
  4. 当处理完成后,Process 方法调用 ProcessCompletedHandler 方法,输出消息。
事件

事件是基于委托的更高层次的抽象,用于发布和订阅某些事件。事件声明允许一个类通知其他类某些事情的发生,同时保持封装性和松耦合性。

定义和使用事件

让我们将上面的示例扩展为使用事件:

public class ProcessBusinessLogic
{
    // 声明事件
    public event NotifyEventHandler ProcessCompleted;

    public void StartProcess()
    {
        Console.WriteLine("Process Started!");
        // 模拟一些处理工作
        System.Threading.Thread.Sleep(3000);
        // 处理完成后,触发事件
        OnProcessCompleted("Process Completed Successfully");
    }

    protected virtual void OnProcessCompleted(string message)
    {
        // 如果有订阅者,则触发事件
        ProcessCompleted?.Invoke(message);
    }
}

public class Program
{
    static void Main(string[] args)
    {
        ProcessBusinessLogic processBusinessLogic = new ProcessBusinessLogic();
        // 订阅事件
        processBusinessLogic.ProcessCompleted += ProcessCompletedHandler;

        processBusinessLogic.StartProcess();

        Console.ReadKey();
    }

    private static void ProcessCompletedHandler(string message)
    {
        Console.WriteLine(message);
    }
}

在这个示例中:

  1. ProcessCompleted 事件声明在 ProcessBusinessLogic 类中,类型为 NotifyEventHandler
  2. StartProcess 方法中,当处理完成时,通过调用 OnProcessCompleted 方法来触发 ProcessCompleted 事件。
  3. Program 类中,通过 += 操作符订阅 ProcessCompleted 事件,并指定事件处理程序 ProcessCompletedHandler
委托与事件的区别

尽管委托和事件都允许方法作为参数进行传递,但它们在使用上有一些重要的区别:

  • 委托可以在类外部直接调用,而事件只能在类内部触发,保持了封装性。
  • 事件通过 +=-= 操作符来添加和移除订阅者,而委托则是直接赋值。
总结

C#中的事件和委托是实现事件驱动编程的重要工具。委托提供了一种类型安全的方法来引用和调用方法,而事件则为发布-订阅模式提供了更高层次的抽象,使得不同模块之间可以通过事件进行松耦合通信。通过理解和使用事件和委托,可以大大提高代码的灵活性和可维护性。

标签:委托,C#,void,Process,深入,事件,ProcessBusinessLogic,public
From: https://blog.csdn.net/weixin_67170874/article/details/140620128

相关文章

  • git how to fix conflict(git中解决冲突问题)
    git发生conflict时应该怎么办?这里列举了三个方案,但是都有其劣势,斟酌之后再决定如何处理。修改冲突文件并合并退回到之前版本强制拉取覆盖当前版本修改冲突文件这个方法是比较常见的方法,且冲突文件不多时修改的文件相对较少。查看当前git状态和冲突文件gitstatus修......
  • GRL Papers with codes
    GRL相关论文以及代码(转载自IEEEReinforcementLearningonGraphs:ASurvey)2024YearVenueModelTitleAlgorithmPaperCode2024IEEETransactionsonComputationalSocialSystemsToupleGDDToupleGDD:AFine-DesignedSolutionofInfluenceMaximizationbyDeepRein......
  • AC自动机
    即在trie上kmp。AC自动机是一种多模式串匹配算法,用于在一个文本串中查找多个模式串。注意到,AC自动机的\(fail\)也构成了一个树形结构。我们只需要在操作完进行一个离线拓扑排序就不用每次匹配到一个点,暴力跑完所有fail确认是哪些模式串。structAC{vector<int>end[MAXN];......
  • c++(0) sophus矩阵转换
     1安装sophus2使用代码2-1R,t矩阵q四元数转换so3和se3 CMakeLists.txtcmake_minimum_required(VERSION3.0)project(useSophus)#为使用sophus,需要使用find_package命令找到它find_package(SophusREQUIRED)#Eigeninclude_directories("/usr/include/eigen3"......
  • 小型plc的自由协议通讯( 基于RS232)
    1,接线  2,串口设置  2,程序监控 3,串口测试小工具 ......
  • 登陆京东(滑块验证),验证码识别,Scrapy框架介绍及其使用,持久化存储到本地
    Ⅰ案例登陆京东(滑块验证)【一】下载opencv库pipinstallopencv-python【二】数据准备先将京东的滑块图片下载到本地背景图background.png滑块图tag.png【三】展示获取滑块的移动数据importos.path#使用opencv识别图像计算滑块之间的距离importcv2impo......
  • [神秘 trick] 减半警报器
    完了遇见究极神秘shabertrick了。题目:GYM我们发现可以近乎\(O(1)\)判断合法,但是非常难维护集合。这个时候非常难搞,是时候发挥人类智慧了。我们知道,一个设备\(x\)被至多被三个观测台观测。那么,不妨假设它们为\(a,b,c\)。我们想对于每个自身的权值\(w\)设一个阈值,超......
  • cs04 浅谈编译和链接
    C/C++语言中编译和链接通常都是自动完成的,win上VS全部包圆了,什么都不用操心,linux上使用cmake编写CMakeLists.txt也可以使用短短几行代码构建一个工程。那么编译和链接到底在我们看不到的地方做了什么呢?深入理解计算机系统中有一句话大多数编译系统提供了编译器驱动程序(com......
  • C#中栈和堆以及修饰符
    关于堆中字符串的存放strings1="123"strings2="123"strings1="456"此时s1输出为456而s2仍然为123因为在使用Stringstr="字符串"的方式来创建String变量的时候,那么String的值便会存储在String常量池中,在我们以这种方式创建String变量时,编译器会先判断你这个内容......
  • modbus TCP
    目录1.modbus 1.1分类1.2特点2.modbusTCP2.1组成2.2报文头3.寄存器4.功能码4.1功能码代码4.2寄存器操作5.练习练习一练习二1.modbus Modbus通信协议具有多个变种,其中有支持串口,以太网多个版本,其中最著名的是ModbusRTU、ModbusASCII和ModbusTC......