委托(Delegate)和事件(Event)-(下篇)
委托(Delegate)与事件(Event)-(上篇)-CSDN博客
上一篇内容!
一、创建非静态委托
在C#中,使用非静态委托意味着将委托绑定到类的实例方法上,而不是静态方法。这允许你通过委托调用特定对象上的方法,从而实现更灵活和面向对象的设计。下面我们将详细介绍如何创建、实例化以及调用非静态委托,并讨论它们的应用场景和注意事项。
定义一个委托类型,它可以指向符合该签名的实例方法。
public delegate void ProgressReporter(int percentComplete);
这里我们定义了一个名为 ProgressReporter
的委托类型,它接受一个整数参数并返回 void
。接下来,在某个类中定义一个与委托签名匹配的实例方法:
public class Worker {public void ReportProgress(int percent) {Console.WriteLine($"Progress: {percent}% complete.");}
}
在这个例子中,Worker
类包含了一个名为 ReportProgress
的实例方法,它可以作为 ProgressReporter
委托的目标。
实例化非静态委托
需要创建一个非静态委托实例,必须先创建一个包含目标方法的对象实例。然后你可以将该实例的方法赋值给委托变量。以下是几种常见的做法:
直接赋值:最简单的方式是直接给委托变量赋值为实例方法的名字。
Worker worker = new Worker();
ProgressReporter reporter = worker.ReportProgress;
使用 new
关键字:也可以显式地使用 new
来创建委托实例。
ProgressReporter reporter = new ProgressReporter(worker.ReportProgress);
Lambda 表达式:如果实例方法非常简单,可以考虑使用 lambda 表达式来代替命名的方法。
ProgressReporter reporter = (percent) => worker.ReportProgress(percent);
如果一旦创建了委托实例,就可以像调用普通方法一样调用它:
reporter(50); // 输出: Progress: 50% complete.
值得注意的是,当一个实例方法被赋值给委托对象时,这个委托对象不仅要保留着对方法的引用,还要保留方法所属实例的引用。这意味着如果你尝试访问委托的 Target
属性,它将返回原始方法所在的对象实例。对于上面的例子来说,reporter.Target
应该等于 worker
对象。
非静态委托的应用场景
非静态委托特别适合用于那些需要维护状态或依赖于对象内部成员的操作。比如,在事件处理程序中,你可能希望订阅者能够根据自身状态作出反应;或者在一个复杂的业务逻辑里,不同的实体可能会执行相似但又略有差异的行为。此时,非静态委托可以帮助你封装这些行为,并且使得代码更加模块化和易于扩展。
此外,非静态委托还经常出现在跨窗体通信等场合。例如,当你想让一个子窗体修改父窗体的状态时,可以通过定义一个委托并在子窗体上调用相应的方法来实现这一点。这种方式避免了直接暴露父窗体的具体实现细节,同时也保持了良好的解耦性。
注意事项
虽然非静态委托提供了强大的功能,但在使用过程中也有一些需要注意的地方:
生命周期管理:由于非静态委托持有对目标对象的引用,因此如果不小心可能会导致内存泄漏。特别是当委托被长时间持有(如全局事件处理器)而目标对象不再需要时,应该及时解除订阅以释放资源。
线程安全问题:如果多个线程同时操作同一个委托实例,则可能会引发竞态条件。为了确保线程安全,可以在多线程环境中采取适当的同步措施。
委托链中的异常传播:在一个多播委托链中,如果其中一个方法抛出未处理的异常,那么后续的方法将不会被执行,并且异常会被传递给调用者。因此,在设计时应考虑到这一点并适当地处理可能出现的问题
总之,正确地使用非静态委托可以使你的应用程序更加灵活、可维护并且符合面向对象编程的原则。通过理解其工作原理和潜在的风险点,你可以更好地利用这一特性来构建高质量的软件系统。
二、委托使用
委托提供了一种机制,使得方法可以作为参数传递给其他方法,并且可以在需要的时候调用这些方法。委托的应用场景非常广泛,包括但不限于事件处理、回调函数、多线程编程以及 LINQ 表达式等。
实例1
定义一个委托类型 MathOperation
,它可以接受两个整数并返回一个整数结果。然后我们将创建不同的方法来执行加法和乘法操作,并将它们绑定到这个委托上。
using System;namespace MathOperations {// 定义委托类型public delegate int MathOperation(int x, int y);class Program {// 加法方法static int Add(int a, int b) => a + b;// 乘法方法static int Multiply(int a, int b) => a * b;static void Main(string[] args) {// 创建委托实例MathOperation operation = Add;Console.WriteLine($"Addition: {operation(3, 5)}"); // 输出 Addition: 8// 更改委托实例指向的方法operation = Multiply;Console.WriteLine($"Multiplication: {operation(3, 5)}"); // 输出 Multiplication: 15}}
}
实例2
事件是 C# 中的一种特殊形式的委托,它允许对象之间建立发布-订阅模式的关系。下面的例子演示了如何使用委托来创建一个简单的按钮点击事件处理器。
using System;class Button {// 定义委托类型用于表示事件处理程序public delegate void ButtonClickEventHandler();// 定义事件public event ButtonClickEventHandler Click;// 触发事件的方法public void OnClick() {Click?.Invoke(); // 如果有订阅者,则调用所有订阅者的处理程序}
}class Program {static void Main(string[] args) {Button myButton = new Button();// 订阅事件myButton.Click += () => Console.WriteLine("Button clicked!");// 模拟按钮点击myButton.OnClick(); // 输出 Button clicked!}
}
实例3
多播委托,这意味着你可以将多个方法链接到同一个委托实例上。当调用该委托时,所有已注册的方法都会被依次执行。
using System;public delegate void NotificationHandler(string message);class Program {static void NotifyByEmail(string msg) {Console.WriteLine($"Email notification: {msg}");}static void NotifyBySMS(string msg) {Console.WriteLine($"SMS notification: {msg}");}static void Main(string[] args) {// 创建单个委托实例NotificationHandler notifier = NotifyByEmail;// 添加另一个方法到委托链notifier += NotifyBySMS;// 调用多播委托notifier("New order received."); // 分别输出 Email 和 SMS 的通知信息}
}
实例4
为了减少重复定义相似委托类型的需要,C# 提供了几种预定义的泛型委托类型,如 Func<>
和 Action<>
。这些泛型委托可以帮助我们更简洁地编写代码。
using System;class Program {static void Main(string[] args) {// 使用 Func<> 泛型委托代替自定义委托类型Func<int, int, int> add = (a, b) => a + b;Console.WriteLine($"Sum: {add(2, 3)}"); // 输出 Sum: 5// 使用 Action<> 泛型委托表示无返回值的方法Action<string> greet = name => Console.WriteLine($"Hello, {name}!");greet("World"); // 输出 Hello, World!}
}
三、事件的声明
事件(Event)是类或对象用于通知其他类或对象某些事情已经发生的一种机制。事件本质上是委托的一个包装器,它允许一个类(发布者)向一个或多个其他类(订阅者)发送通知。为了声明和使用事件,需要遵循一系列步骤,包括定义委托类型、声明事件本身、触发事件以及订阅/取消订阅事件。
定义委托类型
首先需要定义一个委托类型来指定事件处理程序的方法签名。委托定义了可以作为事件处理程序的方法的参数列表和返回值类型。通常情况下,事件处理程序不返回任何值(即返回类型为 void
),并且接受两个参数:一个是事件源对象 (object sender
),另一个是包含事件数据的对象 (EventArgs e
) 或其派生类。
public delegate void NotifyEventHandler(object sender, EventArgs e);
声明事件
如果一旦有了委托类型,就可以在类中声明事件了。这通常是通过使用 event
关键字完成的。下面是一个简单的示例,展示了如何基于前面定义的委托类型声明一个事件:
public class Publisher {// 声明事件public event NotifyEventHandler SomethingHappened;
}
在这个代码片段中,Publisher
类声明了一个叫做 SomethingHappened
的事件,它将使用 NotifyEventHandler
作为其委托类型。这意味着所有订阅此事件的方法都必须符合 NotifyEventHandler
所规定的签名。
触发事件
当某个条件满足时,你可以通过调用事件来通知所有订阅者。通常的做法是在类内部创建一个受保护的方法(如 OnSomethingHappened
),该方法负责检查是否有任何订阅者,并安全地调用它们。
protected virtual void OnSomethingHappened(EventArgs e) {SomethingHappened?.Invoke(this, e); // 确保只有在有订阅者时才调用事件
}
这里使用的 ?.Invoke
语法确保了即使没有任何订阅者也不会抛出异常。
订阅与取消订阅事件
其他类可以通过添加自己的事件处理程序来订阅事件。这通常是通过 +=
运算符实现的,而 -=
则用于取消订阅。例如:
// 订阅事件
publisher.SomethingHappened += HandlerMethod;// 取消订阅
publisher.SomethingHappened -= HandlerMethod;
这里假设 HandlerMethod
是一个符合 NotifyEventHandler
签名的方法。
使用标准.NET事件模式
微软推荐了一套标准化的事件模式,其中事件处理程序总是采用 void EventName(object sender, EventArgs e)
的形式。对于更复杂的情况,你可以使用泛型委托 EventHandler<TEventArgs>
来传递额外的数据。此外,事件参数类应该继承自 EventArgs
,以便于识别标准 .NET 事件模式 - C# | Microsoft Learn。
字段式事件声明
C# 提供了一种更为简洁的方式来声明事件,称为字段式事件声明(field-like events)。这种方式看起来像是直接声明了一个委托类型的字段,并用 event
关键字修饰,但实际上编译器会自动生成必要的包装逻辑。
public event EventHandler OrderPlaced;
相关文章:
委托(Delegate)和事件(Event)-(下篇)
委托(Delegate)与事件(Event)-(上篇)-CSDN博客 上一篇内容! 一、创建非静态委托 在C#中,使用非静态委托意味着将委托绑定到类的实例方法上,而不是静态方法。这允许你通过委托调用特定对象上的方法&am…...
ios 开发配置蓝牙
如果使用了蓝牙功能, 又没有配置, 会出现以下错误: This app has crashed because it attempted to access privacy-sensitive data without a usage description. The apps Info.plist must contain an NSBluetoothAlwaysUsageDescription key with a string value explaini…...
JVM 栈帧结构详解
在 Java 虚拟机(JVM)中,栈帧(Stack Frame)是用于支持方法调用和方法执行的关键数据结构。每个方法从调用开始到执行完成,都对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。本文将详细介绍 JVM 栈帧的结构及…...
HTML和JavaScript实现商品购物系统
下面是一个更全面的商品购物系统示例,包含新增商品、商品的增加删除以及结算找零的功能。这个系统使用HTML和JavaScript实现。 1.功能说明: 这个应用程序使用纯HTML和JavaScript实现。 包含一个商品列表和一个购物车区域。商品列表中有几个示例商品&a…...
(长期更新)《零基础入门 ArcGIS(ArcMap) 》实验三----学校选址与路径规划(超超超详细!!!)
目录 实验三 学校选址与道路规划 3.1 实验内容及目的 3.1.1 实验内容 3.1.2 实验目的 3.2 实验方案 3.3 操作流程 3.3.1 环境设置 3.3.2 地势分析 (1)提取坡度: (2)重分类: 3.3.3 学校点分析 (1)欧氏距离: (2)重分类: 3.3.4 娱乐场所点分析 (1)欧氏距离…...
ip_done
文章目录 路由结论 IP分片 数据链路层重谈Mac地址MAC帧报头局域网的通信原理MSS,以及MAC帧对上层的影响ARP协议 1.公司是不是这样呢? 类似的要给运营商交钱,构建公司的子网,具有公司级别的入口路由器 2.为什么要这样呢?? IP地…...
Mysql体系架构剖析——岁月云实战笔记
1 体系架构 理论内容阅读了mysql体系架构剖析,其他的根据岁月云的实战进行记录。 1.1 连接层 mysql最上层为连接服务,引入线程池,允许多台客户端连接,主要工作:连接处理、授权认证、安全防护、管理连接等。 连接处理&a…...
【卷积神经网络】AlexNet实践
构建模型 模版搭建 # 定义一个AlexNet模型类def __init__(self):# 调用父类的构造函数(如果继承自nn.Module的话)super(AlexNet, self).__init__()# ReLU激活函数self.ReLU nn.ReLU()# 卷积层1:输入1个通道(灰度图)&a…...
LF CRLF
这个提示的含义是:Git 检测到你当前的 file3.txt 文件中使用了 LF(换行符,Line Feed,\n) 作为换行符,但在你系统的 Git 配置中,指定要将其转换为 CRLF(回车换行,Carriage…...
Python学习(二)—— 基础语法(上)
目录 一,表达式和常量和变量 1.1 表达式 1.2 变量 1.3 动态类型特性 1.4 输入 二,运算符 2.1 算术运算符 2.2 关系运算符 2.3 逻辑运算符 2.4 赋值运算符 2.5 练习 三,语句 3.1 条件语句 3.2 while循环 3.3 for循环 四&#…...
科研绘图系列:R语言绘制网络图和密度分布图(network density plot)
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载图1图2图3图4图5图6图7图8系统信息参考介绍 R语言绘制网络图和密度分布图(network & density plot) 加载R包 library(magrittr) library(dplyr) library(…...
python解题之寻找最大的葫芦
问题描述 问题描述 在一场经典的德州扑克游戏中,有一种牌型叫做“葫芦”。“葫芦”由五张牌组成,其中包括三张相同牌面值的牌 �a 和另外两张相同牌面值的牌 �b。如果两个人同时拥有“葫芦”,我们会优先比较牌 &#…...
openwrt安装tailscale
1. 下载 进入tailscale的github仓库复制最新版本的链接:点击跳转 wget https://github.com/adyanth/openwrt-tailscale-enabler/releases/download/v1.36.1-fb2f6cf-autoupdate/openwrt-tailscale-enabler-v1.36.1-fb2f6cf-autoupdate.tgz2.解压缩 tar x -zvC / …...
基于物联网的智能插座云平台 WIFI云平台MQTT协议
功能介绍 功能描述: STM32单片机为控制核心 LCD1602液晶显示当前时间温度 开启时间 关闭时间 按键设置开启时间/关闭时间,温度报警上限 到开启时间,继电器自动打开,到关闭时间,自动关闭 通过DS18B20温度传感器获…...
MySQL 事务
概念介绍 事务就是一组DML语句组成,这些语句在逻辑上存在相关性,这一组 DML 语句要么全部成功,要么全部失败,是一个整体。MySQL 提供一种机制,保证我们达到这样的效果。 事务就是要做的或所做的事情,主要用…...
消息中间件面试题-参考回答
消息中间件面试题-参考回答 面试官:RabbitMQ-如何保证消息不丢失 候选人: 嗯!我们当时MYSQL和Redis的数据双写一致性就是采用RabbitMQ实现同步的,这里面就要求了消息的高可用性,我们要保证消息的不丢失。主要从三个层面…...
解决 MyBatis 中空字符串与数字比较引发的条件判断错误
问题复现 假设你在 MyBatis 的 XML 配置中使用了如下代码: <if test"isCollect ! null"><choose><when test"isCollect 1">AND exists(select 1 from file_table imgfile2 where task.IMAGE_SEQimgfile2.IMAGE_SEQ and im…...
【ETCD】【源码阅读】深入解析 etcd 的 `EtcdServer.Start` 函数
深入解析 etcd 的 EtcdServer.Start 函数 在 etcd 的代码中,EtcdServer.Start 是一个关键方法,用于初始化并启动服务器以便处理请求。本文将从源码的角度逐步分析此函数的每一步操作。 函数签名及注释 // Start performs any initialization of the Se…...
嵌入式驱动开发详解16(音频驱动开发)
文章目录 前言WM8960简介I2S协议接口说明 SAI音频接口简介驱动框架简介设备树配置内核使能声卡设置与测试 后续参考文献 前言 该专栏主要是讲解嵌入式相关的驱动开发,但是由于ALSA驱动框架过于复杂,实现音频编解码芯片的驱动不是一个人能完成的…...
【数据结构——查找】二分查找(头歌实践教学平台习题)【合集】
目录😋 任务描述 相关知识 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:实现二分查找的算法。 相关知识 为了完成本关任务,你需要掌握:1.根据键盘输入的一组有序数据建立顺序表,2.顺序表的输…...
探索云原生数据库 PolarDB
引言 在云计算时代,数据库的重要性不言而喻。随着企业数字化转型的加速,对数据库的性能、可靠性和灵活性的要求也越来越高。阿里云推出的云原生数据库 PolarDB,正是为了满足这些需求而设计的一款高性能、兼容性强、弹性灵活的关系型数据库产品。本文将详细介绍 PolarDB 的特…...
OGG FOR MYSQL同步DDL
以下实验测试OGG FOR mysql 同步DDL, OGG 21.3 MYSQL 8.0.27 --创建测试数据 create table oggddl_20241201 (oid int primary key ,oname varchar(10)); create table oggddl_20241202 (oid int primary key ,oname varchar(10)); create table oggddl_20241203…...
【CAN】asc报文格式文件合并(python版)
目录 一、简介二、合并asc格式报文1、准备多个asc文件2、根据时间合并asc文件3、结果 三、总结四、参考 一、简介 CAN通信:CAN(Controller Area Network)是一种多主方式的串行通讯总线。基本设计规范要求有高位速率、高抗电磁干扰性…...
C++之STL的map容器
map map的实现方式 set是一个有序的关联容器,是基于平衡二叉搜索树(红黑树)实现的,元素是有序的 map的用法 #include <iostream> #include <map> using namespace std;const int ADDSIZE 20; int main() {map<int, int> m;cout &…...
基于卷积神经网络的图像二分类检测模型训练与推理实现教程 | 幽络源
前言 对于本教程,说白了,就是期望能通过一个程序判断一张图片是否为某个物体,或者说判断一张图片是否为某个缺陷。因为本教程是针对二分类问题,因此主要处理 是 与 不是 的问题,比如我的模型是判断一张图片是否为苹果…...
react-dnd 拖拽事件与输入框的文本选中冲突
问题描述 当我们使用拖拽库的时候,往往会遇到拖拽的一个元素他的子孙元素有输入框类型的dom节点,当拖拽的事件绑定在该元素身上时候,发现子孙的输入框不能进行文本选中了,会按住鼠标去选中文本的时候会触发拖拽 实际的效果&…...
‘Close Project‘ is not available while IDEA is updating indexes的解决
XXX is not available while IDEA is updating indexes IDEA 1.Remove from Recent Projects 2.重新 Open工程即可...
如何解决samba服务器共享文件夹不能粘贴文件
sudo vim /etc/samba/smb.conf在samba的配置文件中增加一个选项 writable yes重启Samba服务以使更改生效: sudo service smbd restart...
Three.js入门-材质详解,构建视觉真实感的核心
Three.js 材质详解:构建视觉真实感的核心 Three.js 是一个强大的 3D JavaScript 库,它为开发者提供了丰富的工具来创建和渲染逼真的三维场景。在这些工具中,材质是一个非常重要的组成部分。材质定义了物体表面的外观特性,例如颜色…...
GitHub、Google等镜像加速地址收集
GitHub、Google等镜像加速地址收集 摘要 本文用于收集GitHub、Google等镜像/加速地址。 GitHub GitHub加速地址一览 fastgithub Https://www.fastgithub.com/(推荐) 站源地址缓存github.comwww.fastgithub.com无raw.githubusercontent.com无github.gi…...
五、网络层:控制平面,《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》
目录 一、导论 二、路由选择算法 2.1 路由(route)的概念 2.2 网络的图抽象 2.2.1 边和路由的代价 2.2.2 最优化原则 2.3 路由的原则 2.4 路由选择算法的分类 2.5 link state 算法 2.5.1 LS路由工作过程 2.5.2 链路状态路由选择(lin…...
Fix the “The repository no longer has a Release file” error on Ubuntu 23.04
背景信息 在Ubuntu 23.04操作系统上执行apt-get update命令更新操作系统时,得到以下错误 登录后复制 # apt-get update Ign:1 http://mirrors.aliyun.com/ubuntu lunar InRelease Ign:2 http://mirrors.aliyun.com/ubuntu lunar-updates InRelease Ign:3 http://mir…...
开源 AI 智能名片 S2B2C 商城小程序对私域流量运营的全方位助力
在当今竞争激烈的商业环境中,私域流量运营已成为企业实现可持续发展和提升竞争力的关键策略之一。开源 AI 智能名片 S2B2C 商城小程序凭借其独特的功能与特性,从多个维度为私域流量运营提供了强有力的支持与推动,以下将详细阐述其在各个方面的…...
Java Exception解决方法
Java中的Exception是所有异常的基类,它指的是程序在执行过程中发生的非严重错误,比如空指针异常、数组越界异常等。 为了解决Java中的Exception,从以下步骤进行排查解决: 阅读错误信息:查看异常的完整堆栈跟踪信息&a…...
HCIA-Access V2.5_2_2_2网络通信基础_IP编址与路由
网络层数据封装 首先IP地址封装在网络层,它用于标识一台网络设备,其中IP地址分为两个部分,网络地址和主机地址,通过我们采用点分十进制的形式进行表示。 IP地址分类 对IP地址而言,它细分为五类,A,B,C,D,E,…...
JeecgBoot passwordChange 任意用户密码重置漏洞复现
0x01 产品简介 Jeecg Boot是一个企业级低代码开发平台,基于前后端分离的架构,融合了SpringBoot、SpringCloud、Ant Design、Vue、Mybatis-plus、Shiro、JWT等多种主流技术,旨在帮助企业快速构建各种应用系统,提高开发效率,降低开发成本。采用最新主流的前后分离框架,使得…...
7-8 整型关键字的散列映射
给定一系列整型关键字和素数 p,用除留余数法定义的散列函数 H(key)key%p 将关键字映射到长度为 p 的散列表中。用线性探测法解决冲突。 输入格式: 输入第一行首先给出两个正整数 n(≤1000)和 p(≥n 的最小素数)&…...
谷粒商城—分布式高级①.md
1. ELASTICSEARCH 1、安装elastic search dokcer中安装elastic search (1)下载ealastic search和kibana docker pull elasticsearch:7.6.2 docker pull kibana:7.6.2(2)配置 mkdir -p /mydata/elasticsearch/config mkdir -p /mydata/elasticsearch/data echo "h…...
MySQL SQL语句性能优化
MySQL SQL语句性能优化指南 一、查询设计优化1. 避免 SELECT *2. 使用 WHERE 进行条件过滤3. 避免在索引列上使用函数和表达式4. 使用 LIMIT 限制返回行数5. 避免使用子查询6. 优化 JOIN 操作7. 避免全表扫描 二、索引优化1. 使用合适的索引2. 覆盖索引3. 索引选择性4. 多列索引…...
【潜意识Java】期末考试可能考的选择题(附带答案解析)
目录 选择题一:Java 数据类型 选择题二:Java 控制结构 选择题三:面向对象编程 选择题四:Java 集合框架 选择题五:Java 异常处理 选择题六:Java 方法 选择题七:Java 流程控制 选择题八&a…...
修炼之道 --- 其一
序言 大家对面试中的面经八股文是怎样的看法呢,从他的名字 八股文 就可以看出来大家可能并不喜欢他,八股文一般是 死板、浮于表面、不重实际 的特点。但是,我们需要通过辩证的角度来看待一个事情,不能单方面来定性! …...
【前端】HTML
目录 一、HTML结构 1.1 HTML标签1.2 HTML文件基本结构1.3 快速生成框架 二、HTML常见标签 2.1 注释标签 !-- –2.2 标题标签 h1到h62.3 段落标签 p2.4 换行标签 br2.5 格式化标签2.6 图片标签 img2.7 超链接标签 a 三、表格标签 3.1 常用标签3.2 合并单元格 四、列表标签五、表…...
LabVIEW实现GPS通信
目录 1、GPS通信原理 2、硬件环境部署 3、程序架构 4、前面板设计 5、程序框图设计 6、测试验证 本专栏以LabVIEW为开发平台,讲解物联网通信组网原理与开发方法,覆盖RS232、TCP、MQTT、蓝牙、Wi-Fi、NB-IoT等协议。 结合实际案例,展示如何利用LabVIEW和常用模块实现物联网系…...
【Python 小课堂】第 2 课 Python 基础知识:语句、常量、变量和注释
第 2 课 基础知识:语句、常量/变量和注释 By Yichen Li 2024/12/14 一、内容简介 在本次课中,介绍Python语句、常量/变量以及代码注释的基本概念,一些详细的概念、扩展及用法等细节,留至后续介绍。 二、Python语句 一般来说&…...
基于STM32设计的工地扬尘与噪音实时监测系统(网页)
一、前言 当前项目使用的相关软件工具、传感器源代码工程已经上传到网盘(实时更新项目内容):https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?fromfrom_copylink 1.1 项目开发背景 近年来,随着城市化进程的…...
LLM之RAG实战(五十)| FastAPI:构建基于LLM的WEB接口界面
FastAPI是WEB UI接口,随着LLM的蓬勃发展,FastAPI的生态也迎来了新的机遇。本文将围绕FastAPI、OpenAI的API以及FastCRUD,来创建一个个性化的电子邮件写作助手,以展示如何结合这些技术来构建强大的应用程序。 下面我们开始分步骤操…...
JavaScript 中的 Map方法
JavaScript 中的 Map方法 在 JavaScript 中,Map 是一种用于存储键值对的数据结构,相较于传统的对象(Object),Map 提供了更高效的键值对操作方式适合处理需要频繁操作键值对的场景。 1. 创建 Map const map new Map…...
img引入svg如何修改颜色
方法1:通过css中filter:drop-shadow 首先需要一个容纳图标的父盒子(下方实例中的.svg-img),通过css造一个图标的‘影子’(.svg-color中的drop-shadow),然后设置‘影子’的颜色,再把图标本体移出父盒子&…...
自然语言处理基础及应用场景
自然语言处理定义 让计算机理解人所说的文本 语音 Imitation Game 图灵测试 行为主义 鸭子理论 自然语言处理的基本任务 词性标注:区分每个词名词、动词、形容词等词性命名实体的识别:名词的具体指代是哪一类事物共指消解:代词指代的是前面…...
构建centos docker基础镜像
1、介绍 比较老的版本docker镜像,不太好找,可以尝试自己构建 各版本构建基础镜像方法不太一样,方式也不同,自己尝试,本文只介绍了我自己的尝试 2、构建centos5.11 docker镜像 准备iso文件 (1)安…...