C# 委托和事件(事件)

回调(callback)函数是Windows编程的一个重要部分。C或C++编程背景,在许多Windows API中使用过回调。VB添加AddressOf关键字后,开发人员就可以利用以前一度受到限制的API。回调函数实际上是方法调用的指针也称为函数指针。.NET以委托的形式实现函数指针的概念。C中函数指针只不过是一个指向存储单元的指针,无法说出这个指针实际指向什么,像参数和返回类型等更不知晓。

事件

事件基于委托,为委托提供一种发布/订阅机制。在架构内到处都能看到事件。

事件发布程序

对于事件,使用add和remove关键字添加和删除委托的处理程序:

复制代码
private delegate Eventhandler<CarInfoEventArgs>newCarInfo;
public event EventHandler<CarInfoEventArgs>newCarInfo{
    add
    {
        newCarInfo+=value;
    }
    remove
    {
        newCarInfo=value;
    }
}
}

在触发事件之前,需要检查委托NewCarInfo是否不为空。如果没有订阅处理程序,委托就是空。

事件侦听器

Consuer类用作事件侦听器。

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
//Consumer用于事件侦听器
namespace 事件发布程序
{
   public class Consumer
    {
        private string name;
        public Consumer(string Name)
        {
            this.name = name;
        }

        public void NewCarIsHere(object? sender, CarinfoEventArgs e) =>
            Console.WriteLine($"{0}:car{1} is new",name,e.Car);
    }
}

弱事件

通过弱事件,直接连接到发布程序和侦听器。例如,如果侦听器不再直接引用,发布程序就仍有一个引用。垃圾回收器不能清空侦听器占用的内存,因为发布程序扔保有一个引用,会针对侦听器触发事件。这种连接可以通过弱事件模式来解决,即使用WeakEventManager作为发布程序和侦听器之间的中介。

相关推荐
cndes7 分钟前
给Miniconda换源,让包下载更迅速
开发语言·python
唐青枫24 分钟前
看懂 IL 的关键:C#.NET 栈机执行模型实战拆解
c#·.net
LuminousCPP26 分钟前
C 语言集中实践全记录:顺序表 + 单链表原理实现与通讯录项目实战【附可运行源码】
c语言·开发语言·数据结构·经验分享·笔记
兰令水28 分钟前
hot100【acm版】【2026.7.13打卡-java版本】
java·开发语言·数据结构·算法·leetcode·面试
铅笔侠_小龙虾1 小时前
Rust 学习(4)-函数与注释
开发语言·学习·rust
我才是银古1 小时前
从零构建 Windows 桌面 RPA 框架:Go 与 .NET 的跨语言协奏
c#·go·rpa
tiana_1 小时前
写了个零依赖的 Go 版本管理器,curl | bash 完事
开发语言·golang·bash
嘘嘘出差1 小时前
Python 爬虫入门实战:爬取豆瓣电影 Top 250
开发语言·爬虫·python
爱写代码的倒霉蛋1 小时前
实现协程的三种方式
开发语言·python
CS创新实验室2 小时前
NumPy数组的C风格和Fortran风格
c语言·开发语言·numpy