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作为发布程序和侦听器之间的中介。

相关推荐
hai3152475432 小时前
九章编译法:DEEPSEEK V3.2汇编编译实例
java·开发语言
lkshop2 小时前
Next.js 网站 SEO 优化:从 SSR、Sitemap 到结构化数据
开发语言·javascript·ecmascript
灯澜忆梦3 小时前
GO_函数_2
开发语言·golang·xcode
apihz3 小时前
经纬度制作高清卫星图片免费 API 接口详解
开发语言·ios·swift
娇气的红酒3 小时前
微软对PHP支持的改进,及其它一些胡言乱语
开发语言·microsoft·php
霸道流氓气质4 小时前
Harness Engineering 模块化指令实战:告别 600 行巨型 AGENTS.md
开发语言·人工智能·python
吠品4 小时前
Mac定时关机、开机自动化:用shutdown和pmset就够了
android·java·开发语言
asdzx674 小时前
C# 通过模板生成 Word 文档:文本与图片占位符替换完整攻略
开发语言·c#·word
wbs_scy4 小时前
仿 muduo 高并发服务器项目:实现轻量级日志宏,方便后续网络库调试
开发语言·php
Huangjin007_4 小时前
【C++11篇(四)】新的类功能、lambda 与包装器详解
开发语言·c++