别把 WPF 写成一个 MainWindow:C#.NET Prism 模块化开发详解
摘要:简介 WPF 项目刚开始时,窗口、按钮和业务代码放在一起,开发速度很快: private void SaveButton_Click(object sender, RoutedEventArgs e) { // 读取输入框 // 校验数据 // 保存数据库 // 弹出提示 } 页面少时问题不明显。功
阅读全文
posted @
2026-09-23 17:54
我是唐青枫
阅读(2)
推荐(0)
别急着拆服务:C#.NET 微服务架构从边界设计到实战
摘要:简介 把一个系统拆成多个项目,并不自动等于微服务。 真正的微服务架构里,每个服务围绕清晰的业务能力组织,可以独立构建、部署和扩缩容;服务管理自己的业务规则和数据,通过网络协议协作。它带来的不是免费的弹性,而是一整套新的分布式问题: 网络会超时、断开或重复发送; 服务地址会变化,需要服务发现或部署平台
阅读全文
posted @
2026-09-18 16:51
我是唐青枫
阅读(9)
推荐(0)
别把 Razor 当成几段 HTML:C#.NET Razor Pages、MVC 视图与实战详解
摘要:简介 Razor 不是一种新的 C# 语言,也不是单纯的 HTML 模板。它是一套把 C#、HTML 和标记语法组合起来的语法与编译机制,ASP.NET Core MVC、Razor Pages 和 Blazor 都会用到。 <h1>欢迎,@Model.Name</h1> HTML 负责页面结构,@
阅读全文
posted @
2026-09-17 18:24
我是唐青枫
阅读(4)
推荐(0)
对象到底住在哪里?C#.NET 托管堆从分配、GC 到内存排查
摘要:简介 写 C# 时,new 一个对象很容易,但背后涉及 CLR 的对象分配、内存区域、GC 根、分代晋升和堆压缩。 托管堆是 CLR 管理托管对象的主要内存区域。它解决了手动 malloc/free 容易出错的问题,但并不意味着内存问题自动消失: 静态集合仍然引用对象,GC 就不能回收; 短时间大量
阅读全文
posted @
2026-09-16 18:10
我是唐青枫
阅读(8)
推荐(0)
别只会看日志:C#.NET SOS 调试扩展从 Dump 到内存泄漏排查
摘要:简介 线上 .NET 程序出现问题时,最麻烦的往往不是“报错了”,而是: 进程内存一直涨,却不知道是哪类对象没有释放; CPU 飙到 100%,日志里只有几行普通请求记录; 接口没有异常,但线程全部卡住; 进程已经退出,只留下一个 Dump 文件; async/await 层层等待,普通调用栈看不出
阅读全文
posted @
2026-09-14 16:44
我是唐青枫
阅读(7)
推荐(0)
C#.NET PInvoke 深入解析:封送、内存布局与原生互操作实战
摘要:简介 在 .NET 里,只要你开始接触这些场景: 调用 Win32 API 复用已有的 C/C++ 动态库 对接系统底层能力或硬件驱动 调用高性能原生库,例如压缩、图像、音视频、加密库 处理句柄、指针、非托管内存 你大概率都会走到一个关键能力: P/Invoke 一句话先说透: P/Invoke 的
阅读全文
posted @
2026-09-10 18:07
我是唐青枫
阅读(7)
推荐(0)
C#.NET StructureMap 从依赖注入到项目实战
摘要:简介 老 .NET 项目里经常能看到这样的代码: var service = new OrderService( new OrderRepository( new SqlConnectionFactory()), new EmailNotifier()); 对象少时,手动 new 很直观。对象关系变
阅读全文
posted @
2026-09-08 10:28
我是唐青枫
阅读(7)
推荐(0)
别把日志、权限写进业务方法:C#.NET 动态代理从原理到实战
摘要:简介 业务方法里经常混着这些代码:记录日志、检查权限、统计耗时、开启事务、读写缓存、捕获异常。 public Order CreateOrder(CreateOrderRequest request) { logger.LogInformation("开始创建订单"); CheckPermissio
阅读全文
posted @
2026-09-07 18:07
我是唐青枫
阅读(5)
推荐(0)
别把 ImmutableArray 当成只读 List:C#.NET 不可变数组深入详解
摘要:别把 ImmutableArray 当成只读 List:C#.NET 不可变数组深入详解 很多代码会把集合暴露成 IReadOnlyList<T>: public IReadOnlyList<string> Names => _names; 这样可以限制调用方不能直接 Add,但它只是一个只读视图。
阅读全文
posted @
2026-08-15 16:59
我是唐青枫
阅读(7)
推荐(0)
别只会解析参数:C#.NET Spectre.Console.Cli 命令行工具实战详解
摘要:别只会解析参数:C#.NET Spectre.Console.Cli 命令行工具实战详解 命令行工具不只是把 args 解析成几个字符串。 一个真正方便使用的 CLI,通常还需要: 清晰的子命令 自动生成帮助信息 强类型参数 参数校验 依赖注入 彩色输出、表格和进度条 明确的错误信息和退出码 Spe
阅读全文
posted @
2026-08-14 14:21
我是唐青枫
阅读(11)
推荐(0)
别再把命令行参数写成一团:C#.NET System.CommandLine 实战详解
摘要:别再把命令行参数写成一团:C#.NET System.CommandLine 2.0 实战详解 控制台程序刚开始可能只有一个参数: mytool --file app.log 随着功能增加,命令行往往会变成这样: mytool config set --file appsettings.json -
阅读全文
posted @
2026-08-13 14:47
我是唐青枫
阅读(14)
推荐(0)
别再手写 args[0]:C#.NET CommandLineParser 命令行工具实战详解
摘要:别再手写 args[0]:C#.NET CommandLineParser 命令行工具实战详解 控制台程序一开始往往只有几个参数: dotnet run -- input.txt output.txt 参数一多,args[0]、args[1] 很快就会变成一场小型灾难:顺序记错会导致业务跑偏,漏传参
阅读全文
posted @
2026-08-12 11:15
我是唐青枫
阅读(7)
推荐(0)
看懂 IL 的关键:C#.NET 栈机执行模型实战拆解
摘要:简介 看 .NET IL 时,最容易卡住的地方通常不是指令名字,而是执行方式。 例如这几行 IL: ldarg.0 ldarg.1 add ret 如果按 C# 的写法去看,会觉得很别扭: 没有变量名 没有 a + b 这种表达式 add 也没有写操作数 ret 到底返回什么 原因很简单: .NET
阅读全文
posted @
2026-07-14 13:35
我是唐青枫
阅读(16)
推荐(0)
线程不是越多越快:C#.NET Thread 生命周期、同步与后台工作线程实战
摘要:简介 Thread 是 .NET 里直接创建和管理线程的底层 API。 命名空间: using System.Threading; 最简单的写法: Thread thread = new(() => { Console.WriteLine("工作线程正在执行"); }); thread.Start(
阅读全文
posted @
2026-06-24 11:24
我是唐青枫
阅读(27)
推荐(0)
别只会反射:C#.NET Emit 动态生成代码实战详解
摘要:简介 Emit 通常指的是: System.Reflection.Emit 它是 .NET 里一套非常底层的运行时代码生成 API。 一句话概括: Emit 可以在程序运行时动态生成 IL、方法、类型、属性、字段和程序集。 普通 C# 代码是先写源码,再编译成程序集,然后运行。 Emit 的思路不一
阅读全文
posted @
2026-06-23 13:40
我是唐青枫
阅读(40)
推荐(0)
别再乱用 StartNew:C#.NET TaskFactory 任务调度实战详解
摘要:简介 TaskFactory 是 .NET 里专门用来创建和调度 Task 的工厂类。 最常见的入口是: Task.Factory.StartNew(...) 很多代码里会把它当成 Task.Run 的高级版,甚至直接用它替代 Task.Run。 这种理解只对了一半。 一句话概括: TaskFact
阅读全文
posted @
2026-06-20 16:26
我是唐青枫
阅读(40)
推荐(0)
C#.NET YARP 服务发现实战:接入 Consul 和 Kubernetes 动态发现后端服务
摘要:简介 前面几篇已经把 YARP 的基础代理、JWT、CORS、OpenTelemetry 都串起来了。 服务发现是网关实战里很关键的一步: YARP 后端地址不要写死,改成从服务发现系统里动态获取。 普通配置里,后端地址通常写在 appsettings.json: "Destinations": {
阅读全文
posted @
2026-05-29 16:37
我是唐青枫
阅读(29)
推荐(0)
别把登录写散了:C#.NET IdentityServer4 统一认证与 JWT 授权实战
摘要:简介 IdentityServer4 是一个基于 ASP.NET Core 的认证授权框架。 它主要做一件事: 集中处理登录、发放 Token、保护 API。 在单体项目里,登录通常直接写在业务系统里: 用户 -> Web 系统 -> Cookie / Session -> 业务接口 项目一多,问题
阅读全文
posted @
2026-05-25 07:33
我是唐青枫
阅读(33)
推荐(0)
C#.NET YARP + OpenTelemetry:网关链路追踪实战
摘要:简介 微服务项目里,接口慢了、报错了、偶发超时了,最怕的不是失败本身,而是不知道请求到底卡在哪一层。 比如一个很常见的链路: 浏览器 | v YARP Gateway | v ProductService | v OrderService 如果只看普通日志,经常只能看到: Gateway 收到请求
阅读全文
posted @
2026-05-22 07:55
我是唐青枫
阅读(40)
推荐(0)
C#.NET YARP 跨域配置详解:网关统一处理 CORS
摘要:简介 前后端分离项目里,CORS 基本绕不开。 本地开发时经常是这样: 前端:http://localhost:5173 网关:http://localhost:5000 商品服务:http://localhost:5101 订单服务:http://localhost:5201 浏览器页面从 htt
阅读全文
posted @
2026-05-18 16:38
我是唐青枫
阅读(33)
推荐(0)