首页 > 编程语言 >详解C#委托与事件

详解C#委托与事件

时间:2024-07-11 11:56:10浏览次数:13  
标签:委托 C# int 详解 事件 new public MyDelegate

image

在C#中,委托是一种引用类型的数据类型,允许我们封装方法的引用。通过使用委托,我们可以将方法作为参数传递给其他方法,或者将多个方法组合在一起,从而实现更灵活的编程模式。委托类似于函数指针,但提供了类型安全和垃圾回收等现代语言特性。

基本概念

定义委托

定义委托需要指定它所代表的方法的原型,包括返回类型和参数列表。例如:

public delegate int MyDelegate(int a, int b);

这定义了一个名为MyDelegate的委托,它代表一个接受两个整数参数并返回一个整数的方法。

创建委托实例

创建委托实例时,可以使用new关键字加上委托类型和要封装的方法名:

MyDelegate myDelegate = new MyDelegate(AddNumbers);

其中AddNumbers是一个符合MyDelegate定义的方法。

调用委托

一旦有了委托实例,就可以像调用方法一样调用它:

int result = myDelegate(5, 3);

多播委托

委托可以被设计为“多播”的,这意味着它们可以调用多个方法。当调用多播委托时,所有注册的方法都会按顺序执行:

MyDelegate del1 = new MyDelegate(AddNumbers);
MyDelegate del2 = new MyDelegate(MultiplyNumbers);
MyDelegate combinedDel = del1 + del2;
combinedDel(5, 3); // 先调用 AddNumbers, 然后调用 MultiplyNumbers

匿名方法和Lambda表达式

从C# 2.0开始,可以使用匿名方法来定义委托:

MyDelegate anonMethod = delegate(int x, int y) { return x + y; };

而在C# 3.0之后,Lambda表达式成为更简洁的选择:

MyDelegate lambdaExpr = (int x, int y) => x + y;

事件

在C#中,事件是一种特殊的委托类型,用于封装消息的发送机制,通常用于组件之间或对象之间的通信。事件是.NET框架中处理异步操作、UI交互和信号通知的核心机制。下面详细介绍事件的概念、定义和使用。

事件的基本概念

事件允许一个类(事件发布者)向另一个或多个类(事件订阅者)广播信息,而无需直接调用接收方的任何方法。这实现了发布者和订阅者之间的解耦,使得代码更加模块化和可维护。

定义事件

事件基于委托类型定义,通常使用System.EventHandler或自定义的委托类型。定义事件时,通常在类中声明一个委托类型的私有字段,并在此基础上声明一个公共的事件属性。例如:

public class Publisher
{
    // 自定义委托类型
    public delegate void MyEventHandler(object source, MyEventArgs args);

    // 定义事件
    private event MyEventHandler myEvent;

    // 使用事件属性暴露事件
    public event MyEventHandler MyEvent
    {
        add { myEvent += value; }
        remove { myEvent -= value; }
    }

    // 触发事件
    public void RaiseEvent()
    {
        if (myEvent != null)
        {
            myEvent(this, new MyEventArgs());
        }
    }
}

在这个例子中,Publisher类有一个名为MyEvent的事件,它基于MyEventHandler委托类型。事件触发时,RaiseEvent方法会被调用,它会检查是否有订阅者,并调用所有订阅者的相应方法。

订阅和取消订阅事件

事件可以通过事件处理程序来订阅。事件处理程序是一个与事件委托类型匹配的方法。订阅事件时,将事件处理程序添加到事件中;取消订阅则移除该处理程序。

class Subscriber
{
    public void OnMyEvent(object sender, MyEventArgs e)
    {
        Console.WriteLine("Event triggered.");
    }
}

// 在某个地方订阅事件
Publisher publisher = new Publisher();
Subscriber subscriber = new Subscriber();
publisher.MyEvent += subscriber.OnMyEvent;

// 取消订阅事件
publisher.MyEvent -= subscriber.OnMyEvent;

使用事件参数

事件经常与事件参数一起使用,这些参数通常封装了事件发生时的附加信息。事件参数是通过继承EventArgs类来创建的。例如:

public class MyEventArgs : EventArgs
{
    public string Message { get; set; }
}

在触发事件时,可以创建事件参数的实例并传递给事件:

public void RaiseEvent()
{
    if (myEvent != null)
    {
        myEvent(this, new MyEventArgs { Message = "Hello, world!" });
    }
}

标签:委托,C#,int,详解,事件,new,public,MyDelegate
From: https://www.cnblogs.com/ayic/p/18295844

相关文章

  • Cesium 点击查询
    代码letclickHandler=null;//functioninitClickHandler(){//初始化clickHandler=newCesium.ScreenSpaceEventHandler(viewer.scene.canvas);//绑定左点击事件clickHandler.setInputAction((click)=>{//获取球面坐标可用于定位或者渲染点位数据......
  • Marking criteria for COMP9444 project
    Marking criteria for COMP9444 projectTotal marks for the project work:35 marks.1.   Project Notebook(s):20 Marks2.   Summary Report (max 4pages): 5 marks3.   Project Presentation: 10 MarksBreakdownofmarksforeachcompon......
  • elasticsearch: 插件安装与删除
    一,安装插件1,查看已安装的插件:[lhdop@blog~]$curl-XGET"localhost:9200/_cat/plugins?v&s=component"namecomponentversion2,从命令行安装smartcn分词插件:[lhdop@blogbin]$./elasticsearch-plugininstallanalysis-smartcnwarning:ignoringJAVA_HOME=/usr/loc......
  • Linux学习笔记(03)——C编程入门
    vim编辑器需要先安装:sudoapt-getinstallvim使用vimxxx.txt:打开文件一般模式(指令模式):默认模式编辑模式:一般按下“a”进入编辑,按下ESC键可退出编辑模式命令行模式(底行模式):先进入一般模式,后输入:/?任意一个进入保存退出:进入底行模式,下面会出现:可在:后输入x保......
  • C#+OpenCV进阶(一)_人体识别
      效果排名:Lbp<Haar<CNN1、Lbp///<summary>///Lbp人脸识别///</summary>publicstaticMatFaceDetection_Lbp(Matmat){varlbpCascade=newCascadeClassifier("model/lbpcascade_frontalface.xml");MatoutMat=newMat();......
  • golang sync.Pool 的基本原理
    sync.Pool包寥寥不过300行代码,却可以为我们提供类似对象池的功能,减少了对象的重复创建于销毁,减少了性能损耗,增加内存复用,同时自带mutex锁可以保证Put/Get操作的并发安全特性,在一些对象需要重复创建销毁的场景中很是实用,今天来看看sync.Pool的基本原理。sync.Pool就在标准......
  • QtQuick.Dialogs中的FileDialog设置默认目录的问题
    在QML中,假如想要使用文件浏览器选择文件或者文件夹时。可以使用FileDialog。FileDialog有个属性folder,设置好路径之后,当你打开fileDialog时,fileDialog当前定位到的路径就是你设置的路径。但是这个folder的设置有点问题,和路径的层级有关系假如你的目标路径是大于等于三级的(比如......
  • C#+OpenCV进阶(三)_操作摄像头与视频文件
    1、VideoCapture的常用属性#region常用属性//_=videoCapture.CaptureType;//获取视频的捕获类型(文件或摄像头)//_=videoCapture.PosAviRatio;//获取或设置视频的相对位置(0开头1结尾)//_=videoCapture.FourCC;//获取或设置视频的编解码的4字符代码//_=......
  • 使用夜莺和 Categraf 快速建设 MySQL 监控
    之前翻译过一篇文章,介绍 MySQL监控的一些原理,本文侧重实操,使用夜莺v7.beta12.1版本为大家做一个演示,采集器使用Categraf,先看一下最终仪表盘效果:下面开工。1.安装夜莺和Categraf夜莺的安装可以参考 夜莺官方文档,Categraf的安装可以参考 Categraf官方文档。这里就不赘......
  • 界面组件Kendo UI for React 2024 Q2亮点 - 生成式AI集成、设计系统增强
    随着最新的2024年第二季度发布,KendoUIforReact为应用程序开发设定了标准,包括生成式AI集成、增强的设计系统功能和可访问的数据可视化。新的2024年第二季度版本为应用程序界面提供了人工智能(AI)提示,从设计到代码的生产力增强、可访问性改进、一系列新的UI组件等。KendoUI致力......