自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(49)
  • 收藏
  • 关注

原创 C#中的服务注册剖析

服务注册是.NET 依赖注入(DI)体系中的核心操作,本质是将服务类型(接口 / 抽象类)与具体实现类型、生命周期绑定,并存储到 DI 容器中的过程。服务类型:对外暴露的抽象契约(通常是接口 / 抽象类),比如。实现类型:服务类型的具体实现类,比如。DI 容器:存储服务注册信息的 “容器”,程序运行时可从中 “取出”(解析)服务实例。生命周期:决定 DI 容器创建服务实例的规则,是服务注册的核心属性。

2025-12-18 22:39:37 649

原创 线程同步的意义

C# 线程同步的核心是控制共享资源的访问顺序技术核心作用适用场景lockMonitor互斥访问临界区大多数共享资源同步简化锁管理C# 13 + 的高性能同步volatile保证可见性 / 有序性简单变量的线程间状态同步原子操作简单数值的递增 / 交换Mutex跨进程同步多进程共享资源重新发送事件减少锁竞争高并发场景的锁重试线程独立副本每个线程的私有状态。

2025-12-17 23:07:40 886

原创 C# 反射与泛型深度结合详解

反射(Reflection)是 C# 的 “元编程” 能力,允许程序在获取类型信息、调用方法、创建实例;泛型(Generic)则是 “类型参数化”,实现类型安全的代码复用。两者结合可突破静态泛型的限制,实现,是框架开发(如 DI 容器、ORM、序列化)的核心技术。本文将从 “基础概念→核心 API→分场景超详细案例→底层原理→避坑指南” 全维度讲解,所有案例均为可直接运行的控制台程序,每一行代码都附带注释和原理说明。

2025-12-16 23:47:38 675

原创 C# 基于 HSL 与基恩士 PLC 通信

HSL(HslCommunication)是国产工业通信框架,支持主流 PLC / 仪表 / 变频器通信,对基恩士 PLC 的 MC 协议做了高度封装,无需手动解析协议帧,只需调用 API 即可完成通信。

2025-12-15 23:33:45 960

原创 C# HSL 与欧姆龙 CIP 协议(EtherNet/IP)的详细通信

CIP 协议的全称是 Common Industrial Protocol(通用工业协议),是一种面向工业自动化领域的开放、多厂商兼容的应用层通信协议,由 ODVA(Open DeviceNet Vendors Association)组织管理和维护。它的核心目标是实现工业设备之间的无缝数据交互,涵盖控制、配置、诊断等全生命周期功能。CIP 是一个与底层物理网络无关的应用层协议,可以运行在多种工业网络上,形成不同的工业总线标准,典型包括:CIP 采用对象模型来描述工业设备的功能,每台设备都被抽象为一系列标准

2025-12-14 23:27:55 833

原创 TPL如何自动调整执行效率

TPL 是 .NET Framework 4.0 及以上版本(.NET Core/.NET 5+ 全面继承并增强)内置的并行编程核心库,隶属于命名空间,本质是对底层线程、线程池、同步原语的高度抽象封装。让开发者无需手动管理线程(创建、销毁、调度),即可高效利用多核 CPU 资源,实现任务级并行,同时自动适配运行时的系统资源状态,动态调整执行效率。传统手动线程管理(Thread类)存在高开销、易出错(如线程安全、死锁)、无法自适应系统负载的问题;

2025-12-13 21:42:31 509

原创 C#中结构(Struct)

结构(struct)是 C# 中一种值类型数据结构,用于封装小型相关数据。它与类(class)类似,可包含字段、属性、方法等成员,但本质是值类型(存储在栈上),而类是引用类型(存储在堆上)。核心特点值类型,赋值时直接复制数据(而非引用);适合存储小型、简单的数据(如坐标、颜色、日期等);不能被继承(密封类型),但可实现接口。// 基本语法访问修饰符 struct 结构名 : 接口1, 接口2...// 成员(字段、属性、方法、构造函数等)示例:定义一个表示二维坐标的结构。

2025-10-12 20:50:33 1231

原创 C#中堆和栈的概念

对比项栈(Stack)堆(Heap)存储内容值类型数据、引用类型的引用引用类型的实际数据管理方式编译器自动分配 / 释放垃圾回收器(GC)自动管理速度极快(连续内存操作)较慢(需查找空闲内存)空间大小小(几 MB)大(GB 级)顺序先进后出,连续存储无序,随机存储典型用途临时变量、方法参数、局部变量对象、字符串、数组等大数据解释为什么值类型赋值是 “复制值”,引用类型赋值是 “复制地址”(如int a = b和的差异)。

2025-10-12 17:48:01 977

原创 C#泛型类

泛型类是可以支持多种数据类型的类,它允许在定义类时不指定具体数据类型,而是在使用时动态指定。核心作用:避免重复编写相似代码(如分别为intstringobject写相同逻辑的类),同时保证类型安全(编译时检查类型,避免装箱拆箱)。// 基本语法:类名后加<T>,T是类型参数(可自定义名称,如TData、TItem)public class 类名<T>// 可以使用T作为属性、方法参数、返回值的类型代码复用:一份代码支持所有类型,无需重复编写类型安全:编译时检查类型,避免运行时类型转换错误。

2025-10-12 15:28:23 376

原创 WPF-数据绑定(Binding)

减少了 UI 与数据之间的胶水代码实现了数据与 UI 的自动同步使代码结构更清晰,关注点分离支持多种绑定场景和高级功能通过实现和使用,可以构建响应式的 WPF 应用程序,让 UI 始终反映最新的数据状态。

2025-08-31 23:51:45 1284

原创 C#关于反射与元数据的探讨

在 C# 中,反射和元数据是非常强大的功能,允许程序在运行时检查、激活类型,调用成员等。

2025-08-14 08:42:15 417

原创 C# 泛型(Generics)详解

类型安全:编译时检查类型,避免运行时类型转换错误。性能优化:减少装箱 / 拆箱操作,尤其对值类型更高效。代码复用:一套逻辑适配多种类型,减少重复代码。灵活性:结合约束、协变、逆变等特性,可适应复杂场景。

2025-08-13 08:46:10 1609

原创 C#Attribute(特性)的定义与使用

1.1 定义Attribute 是一种“声明式元数据(declarative metadata)”机制。• 附加位置:程序集、模块、类型、字段、属性、方法、方法参数、方法返回值、事件、泛型参数、局部变量、本地函数、Lambda 表达式、甚至表达式树。• 本质:编译器把特性的实例化信息序列化到元数据表中;运行期可通过反射读取,或供编译器、分析器、Source Generator 消费。• 语法:用方括号[...]写在目标实体前面,可简写、组合、带命名参数。1.2 与注释/ XML 的区别。

2025-08-09 08:39:16 1296

原创 C#中的锁与信号量

lock:适合简单的独占访问场景,使用简单,性能好,是多线程同步的首选方案;:适合需要限制并发数量的场景(如连接池、限流),支持异步,灵活性更高。

2025-08-07 08:38:11 1194

原创 C#中的Task的概念与使用

封装一个异步操作,可用于执行耗时任务(如网络请求、文件 IO、数据库操作等),避免阻塞主线程,提高程序响应性。命名空间,是 .NET 异步编程模型(APM)的核心组件。是 C# 中用于表示异步操作的对象,属于。Task 有以下几种核心状态(通过。任务中抛出的异常会被包装在。方法的返回类型通常为。(仅用于事件处理)。

2025-08-06 08:42:54 2235

原创 C#Drawing 类详解

用 DrawingBrush 或 DrawingImage 把 Drawing 变成 Brush/Image,再赋给控件的 Background、Source 等属性。• 常用套路:GeometryDrawing/DrawingGroup → DrawingBrush/DrawingImage → Shape 或 Image 控件。• WPF 的 Drawing 体系是“矢量指令树”,轻量、可缓存、可动画,适合高性能场景(千级图形)。• DrawingGroup(容器,可组合其它 Drawing)

2025-08-06 08:06:52 479

原创 CancellationToken的概念与原理

维度说明定义一个轻量值类型(struct),用于在协作式取消模型中传递“取消请求”信号。协作式任务必须主动检查或注册回调才能响应;不会强制终止线程(非 Thread.Abort)。组合性支持多 token 组合、链接、父-子级联。无处不在Task.Run等 100+ 内置 API 均提供重载。CancellationToken 像“火灾警报器”,CancellationTokenSource 是“按下警报的人”。

2025-08-04 08:44:07 1078

原创 解剖 .NET 经典:从 Component 到 BackgroundWorker

set;// 清理文件句柄等资源编译后将 dll 添加到工具箱即可拖拽到 WinForm 设计器。可在属性窗口编辑LogPath。

2025-08-03 17:23:41 953

原创 C#反射的概念与实战

一句话定义反射是一种“在运行时(Run-Time)而不是编译时(Compile-Time)去探查、创建、调用、修改程序集(Assembly)、类型(Type)、成员(Member)”的 API。类比把程序当成一辆行驶中的高铁:• 正常情况下,我们只能在车站(编译期)知道每节车厢(类)里有哪些座位(字段/属性/方法)。• 有了反射,就相当于在高铁飞驰时还能临时打开任意一节车厢、查看座位、甚至把乘客换到别的车厢。反射能做什么• 动态加载 dll(插件式架构)

2025-07-31 23:02:24 1183 2

原创 C#接口的定义与使用

• 接口是一组“能力”或“契约”的抽象描述,只规定“能做什么”,不规定“怎么做”。• 在 C# 中,接口是一种完全抽象的类型(fully abstract type)。• 关键词:interface。• 命名规范:以大写字母 I 开头,如 ILogger、IDisposable。

2025-07-31 08:43:33 494

原创 C#多线程,同步与异步详解

多线程编程是现代编程中非常重要的一部分,它可以提高程序的性能和响应性。在 C# 中,可以通过多种方式创建线程,如使用Thread类、Task类等。线程同步是多线程编程中一个关键问题,可以通过锁、互斥体、信号量等机制来解决。线程安全的集合可以方便地在多线程环境中使用。线程池可以提高线程的复用性,减少线程创建和销毁的开销。异步编程可以进一步提高程序的响应性和性能。在开发多线程程序时,需要注意调试和异常处理,以确保程序的稳定性和可靠性。可能有小伙伴说多线程与异步编程看起来这么相像的,下面来分析下它们的异同点。

2025-07-26 08:48:37 1223

原创 C#LINQ的用法详解

LINQ 是一种统一的查询语法,它允许使用类似 SQL 的语法来查询各种数据源,如集合、数据库、XML 等。它将查询能力直接集成到 C# 语言中。是实现 LINQ 语法与特定数据源之间转换的组件。例如,LINQ to Objects 用于查询内存中的集合对象;LINQ to SQL 用于查询 SQL Server 数据库;LINQ to XML 用于查询 XML 数据。是 LINQ 查询操作的对象,可以是数组、列表、数据库表、XML 文档等。它提供了数据供查询使用。

2025-06-16 08:17:58 990

原创 C#RSA加密

RSA加密是一种非对称加密算法。非对称加密算法使用一对密钥,公钥(Public Key)和私钥(Private Key)。公钥可以公开发布,用于加密数据;私钥则由接收者自己保存,用于解密数据。这就好比有一个特殊的盒子,任何人都可以用公钥这个锁将物品锁在这个盒子里,但是只有拥有私钥的人才能打开这个盒子获取物品。RSA加密算法基于大数质因数分解的困难性原理。简单来说,就是将两个大素数相乘很容易,但是将它们的乘积分解回原来的两个素数却非常困难。

2025-06-15 10:28:07 862

原创 C#操作CSV文件的详细教程

根据 CSV 文件的结构定义一个对应的类,方便对数据进行操作。

2025-06-12 08:20:38 2169

原创 C#AES加密

AES(Advanced Encryption Standard,高级加密标准)是一种对称加密算法,由美国国家标准与技术研究院(NIST)于 2001 年发布,用于替代之前的 DES(数据加密标准)。它是一种分组密码,以 128 位(16 字节)为分组长度,支持 128 位、192 位和 256 位的密钥长度,分别为 AES - 128、AES - 192 和 AES - 256,其中 AES - 128 应用最为广泛。

2025-06-11 08:01:35 1775

原创 SQLServer中的存储过程与事务

存储过程(Stored Procedure)是一组预编译的 SQL 语句的集合,它们被存储在数据库中,可以通过指定存储过程的名称并执行来调用它们。存储过程可以接受输入参数、输出参数,并且可以返回执行结果。事务(Transaction)是一组操作的集合,这些操作要么全部成功,要么全部失败。事务是一个不可分割的工作单位,它确保了数据的完整性和一致性。存储过程(Stored Procedure)是一组预编译的 SQL 语句的集合,它们被存储在数据库中,可以通过指定存储过程的名称并执行来调用它们。

2025-06-06 23:43:36 1177

原创 C#中的依赖注入

定义:依赖注入是一种设计模式,允许将组件的依赖关系从内部创建转移到外部提供。这样可以降低组件之间的耦合度,提高代码的可测试性、可维护性和可扩展性。核心思想:类不应该自己创建依赖对象,而应该由外部环境将依赖对象注入到类中。实现:使用字典存储接口类型和实现类型的关系,使用创建实例。示例代码// 注册服务// 解析服务else// 使用示例依赖注入的核心:解耦组件之间的依赖关系,提高代码的可测试性和可维护性。主要方式:构造函数注入、属性注入、方法注入。生命周期管理实际应用。

2025-06-04 08:23:13 2162

原创 C#委托的概念与使用方法

C# 中的委托是一种强大的机制,它允许将方法作为参数进行传递,并且具有类型安全性。系统委托如ActionFunc和Predicate提供了方便的预定义委托类型,可以用于各种常见的场景。事件委托则是委托在事件驱动编程中的特殊应用,用于解耦事件源和事件处理者。委托的多播特性使得可以将多个方法组合在一起形成调用链,提供了更大的灵活性。通过合理使用委托,可以使代码更加模块化、灵活和可维护。

2025-05-30 08:21:40 1223

原创 ModbusTcp协议

功能码是 Modbus TCP 协议中的核心指令,用于指定客户端希望服务器执行的操作。

2025-05-28 23:42:25 5492

原创 C#中BackgroundWorker的概念与用法详解

在一个 Windows 窗体应用程序中,需要从网络下载一个较大的文件,为了避免下载过程中 UI 界面卡死,并且能够显示下载进度,同时允许用户取消下载任务,可以使用 BackgroundWorker。在处理此事件时,需要注意不能在该事件处理程序中直接操作 UI 元素,因为此事件是在后台线程中触发的。在这个示例中,当用户点击开始下载按钮时,BackgroundWorker 开始执行后台任务,模拟下载过程并定期报告进度。在主线程中处理此事件,可以在此处更新 UI 组件以显示进度信息,如进度条的值、状态文本等。

2025-05-15 08:40:05 1805

原创 C#23种设计模式(八)桥接模式

使两者可以独立扩展变化。其核心思想是。

2025-03-18 08:41:43 473

原创 C#23种设计模式(七)抽象工厂

是一种创建型设计模式,它提供了一种方式,可以创建一系列相关或相互依赖的对象,而无需指定它们的具体类。抽象工厂模式强调的是的概念,即每个工厂创建的对象属于一个系列。: 在Open方法中,分别创建了南昌工厂和上海工厂的实例,并使用它们创建对应的鸭脖和鸭架对象,然后调用Print方法打印信息。定义了创建鸭脖和鸭架的抽象方法。和分别实现了抽象工厂类,提供了创建南昌和上海鸭脖及鸭架的具体实现。YaBo和YaJia分别是鸭脖和鸭架的抽象类,定义了Print抽象方法。和分别实现了对应的抽象产品类,提供了具体的Print。

2025-03-18 00:46:53 799

原创 C#23种设计模式(六)代理模式

客户端通过代理类来间接访问真实主题类的功能。

2025-03-15 08:37:42 660

原创 C#23种设计模式(五)享元模式

享元工厂通过字典存储已创建的享元对象,确保相同的对象只被创建一次。客户端通过工厂获取享元对象,从而实现对象的共享,减少内存的使用。这种模式特别适用于需要大量细粒度对象的场景,通过共享对象来提高性能和资源利用率。

2025-03-14 23:35:21 474

原创 C#23种设计模式(四)外观模式

在C#中,外观模式(Facade Pattern)是一种结构型设计模式,旨在通过提供一个统一的接口来简化复杂子系统的使用。外观模式通过一个高层接口将多个子系统的复杂操作封装起来,客户端只需与外观类交互,无需直接处理子系统的复杂性。客户端代码仅依赖外观类,不直接调用子系统类,降低了耦合度。子系统逻辑修改时(如新增权限检查),只需调整外观类或对应子系统,客户端无需改动。子系统类专注于实现特定功能,外观类负责协调它们的工作流程,符合单一职责原则。:客户端只与外观类交互,减少对其他类的依赖。方法,向学生发送通知。

2025-03-14 00:48:32 308

原创 C#23种设计模式(三)组合模式

透明式组合模式:通过在抽象组件类中声明所有管理子节点的方法,使得客户端可以一致地处理叶子节点和分支节点。但叶子节点需要实现这些方法并抛出异常,因为它们不能有子节点。安全式组合模式:通过在抽象组件类中只声明绘制方法,而将管理子节点的方法仅在分支节点类中实现,避免了叶子节点抛出异常的问题。但客户端需要知道对象的具体类型,以便正确调用相应的方法。

2025-03-11 20:54:30 779

原创 C#23种设计模式(二)备忘录模式

这种模式的核心思想是通过创建对象状态的快照(备忘录),并在需要时恢复到该快照状态,从而实现状态的管理。在代码中,MobileOwner类就是发起人,它维护联系人列表的状态,并提供创建备忘录和恢复状态的方法。:可以方便地保存多个状态,并在需要时恢复到任意一个之前的状态,适用于需要频繁保存和恢复状态的场景。管理角色不访问备忘录中的状态信息,只是负责保存和提供备忘录,这符合备忘录模式中管理角色的职责。当需要恢复状态时,发起人从管理角色获取备忘录对象,并使用备忘录中的状态恢复自己的内部状态。

2025-03-08 19:26:38 1188

原创 C#23种设计模式(一) 装饰器模式

装饰者模式是一种结构型设计模式,允许在不改变对象接口的情况下动态地为对象添加新的职责或功能。这种模式通过创建一个装饰类来包装原始对象,并在装饰类中添加新的行为或功能。:定义对象的接口,装饰者和具体对象都实现这个接口。:实现组件接口的具体对象,提供基本功能。:维护一个对组件对象的引用,并实现组件接口。装饰者类通常在其方法中调用被装饰对象的方法,并在需要时添加新的行为。:实现装饰者抽象类,为组件对象添加新的职责或功能。定义组件接口(Phone抽象类)

2025-03-08 17:55:51 411

原创 依赖注入设计模式

依赖注入的核心思想是将一个对象所需的依赖关系从其本身解耦,而是通过外部提供这些依赖,通常通过构造函数、属性或方法参数来实现。在 C# 中,依赖注入(Dependency Injection,DI)是一种设计模式,用于处理组件之间的依赖关系。这样做的好处是,可以更轻松地替换实际的数据库操作实现,例如在测试中使用模拟的存储库来模拟数据库行为,而不必改变。Core 中的内置 DI 容器)能够自动管理依赖项的创建和注入,进一步简化了依赖关系的管理。的实例,而是依赖于外部传入的。例如,考虑一个服务类。

2023-12-15 21:12:21 670

原创 C#中的单例设计模式

单例设计模式是一种创建型设计模式,它确保类只有一个实例,并提供一个全局访问点。

2023-12-15 19:50:11 580

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除