随笔分类 -  .NET Core

摘要:泛型方法 .NET 中的泛型方法带有一个或多个类型参数,可以在保证类型安全的同时处理不同的数据类型。当我们希望代码针对具体类型进行特化,却又不想为每种类型重复编写一份代码时,泛型方法就很有用。 来看一个将两个值相加的泛型方法: T Add<T>(T a, T b) where T : IAdditi 阅读全文
posted @ 2026-08-13 14:26 hez2010 阅读(3426) 评论(5) 推荐(45)
摘要:传统 async/await .NET 自古以来就提供了 async/await 异步编程模型,这套机制允许开发者以同步方式编写异步代码,从而简化了异步编程的复杂性。 async/await 机制本质上是利用 CPS(Continuation Passing Style)变换来实现的。 首先 asy 阅读全文
posted @ 2026-08-10 20:53 hez2010 阅读(5423) 评论(23) 推荐(67)
摘要:.NET 数组的上限 这些年经常看到有人抱怨 .NET 数组的最大长度。 在 .NET 里,数组、集合、Span 以及很多相关 API 都是围绕 32 位长度和索引设计的。GitHub 上曾经有一个很长的 issue 讨论 64 位数组支持,但最后以 "won't fix" 关闭,因为这件事会牵涉到 阅读全文
posted @ 2026-06-30 22:01 hez2010 阅读(3452) 评论(11) 推荐(40)
摘要:前言 Union 类型(联合类型)一直是 C# 社区呼声最高的特性之一。从最初的 discriminated unions 提案到今天,这个特性经历了多年的设计和讨论,终于在 C# 15 中正式落地。 Union 类型允许我们将一个值限定为一组封闭类型中的某一种,并且在针对 Union 值的 swi 阅读全文
posted @ 2026-04-19 19:21 hez2010 阅读(4739) 评论(14) 推荐(27)
摘要:前言 GC 的设计里一直有一个很难绕开的矛盾:高吞吐、低延时、低内存占用,通常很难同时做到。 传统做法里,想要更短的停顿,往往要把更多工作搬到并发阶段,甚至让平时的对象访问承担更高成本;想要更高的吞吐量,又往往意味着平时路径成本必须足够低,于是更多工作会堆到回收阶段;想要更低的内存占用,则又需要更积 阅读全文
posted @ 2026-03-10 01:29 hez2010 阅读(631) 评论(3) 推荐(13)
摘要:前言 在 .NET 里写查询的时候,很多场景下数据其实早就都在内存里了:不是数据库连接,也不是某个远程服务的结果,而就是一个数组或者 List<T>。我只是想过滤一下、投影一下。这时候,通常有几种选择: 写一个 foreach 循环 —— 性能好、可控,但代码稍微有点啰嗦; 用 LINQ —— 写起 阅读全文
posted @ 2025-11-24 00:54 hez2010 阅读(6280) 评论(36) 推荐(77)
摘要:同步代码和异步代码 一般而言,代码可分为同步与异步两类。两者同样需要等待操作完成:同步会阻塞当前线程,直至操作结束后再继续执行后续逻辑;异步则不阻塞当前线程,而是在发起操作时预先注册完成后的处理逻辑,待操作完成时由操作本身或外部机制触发该逻辑。 于是这就带来一个问题,那就是同步代码和异步代码的写法是 阅读全文
posted @ 2025-09-18 00:42 hez2010 阅读(6072) 评论(10) 推荐(68)
摘要:GC 的 STW 问题 GC,垃圾回收器,本质上是一种能够自动管理自己分配的内存的生命周期的内存分配器。这种方法被大多数流行编程语言采用,然而当你使用垃圾回收器时,你会失去对应用程序如何管理内存的控制。C# 允许在自动控制内存的基础之上局部对内存进行手动控制,但是自动控制仍然是主要的场景。 然而 G 阅读全文
posted @ 2025-05-22 00:29 hez2010 阅读(5699) 评论(25) 推荐(66)
摘要:前言 .NET NativeAOT 想必不少开发者都已经很熟悉了,它可以将 .NET 程序集直接编译到原生的机器代码,从而可以脱离 VM 直接运行。简单的一句 dotnet publish -c Release -r <rid> /p:PublishAot=true 就可以做到。 在编写 C++ 程 阅读全文
posted @ 2025-04-07 22:55 hez2010 阅读(3931) 评论(10) 推荐(49)
摘要:前言 什么?用 C# 插值字符串处理器写一个输入用的 sscanf?你确定不是输出用的 sprintf? 我猜不少读者看到标题后大概会有上述的想法。然而我们这里还真就是实现 sscanf,而不是 sprintf。 插值字符串处理器 C# 有一个特性叫做插值字符串,使用插值字符串,你可以自然地往字符串 阅读全文
posted @ 2025-02-16 17:06 hez2010 阅读(1981) 评论(6) 推荐(31)
摘要:Brainfly: 用 C# 类型系统构建 Brainfuck 编译器 阅读全文
posted @ 2025-01-31 23:27 hez2010 阅读(2038) 评论(6) 推荐(15)
摘要:前言 预计在 2024 年 11 月,C# 13 将与 .NET 9 一起正式发布。今年的 C# 更新主要集中在 ref struct 上进行了许多改进,并添加了许多有助于进一步提高生产力的便利功能。 本文将介绍预计将在 C# 13 中添加的功能。 注意:目前 C# 13 还未正式发布,因此以下内容 阅读全文
posted @ 2024-07-27 01:16 hez2010 阅读(4859) 评论(11) 推荐(32)
摘要:.NET NativeAOT 指南 随着 .NET 8 的发布,一种新的“时尚”应用模型 NativeAOT 开始在各种真实世界的应用中广泛使用。 除了对 NativeAOT 工具链的基本使用外,“NativeAOT”一词还带有原生世界的所有限制,因此您必须知道如何处理这些问题才能正确使用它。 在这 阅读全文
posted @ 2024-01-31 18:00 hez2010 阅读(6087) 评论(13) 推荐(61)
摘要:背景 2008 年前后的 Midori 项目试图构建一个以 .NET 为用户态基础的操作系统,在这个项目中有很多让 CLR 以及 C# 的类型系统向着适合系统编程的方向改进的探索,虽然项目最终没有面世,但是积累了很多的成果。近些年由于 .NET 团队在高性能和零开销设施上的需要,从 2017 年开始 阅读全文
posted @ 2022-11-01 16:35 hez2010 阅读(7617) 评论(48) 推荐(106)
摘要:前言 .NET 7 的开发还剩下一个多月就要进入 RC,C# 11 的新特性和改进也即将敲定。在这个时间点上,不少新特性都已经实现完毕并合并入主分支 C# 11 包含的新特性和改进非常多,类型系统相比之前也有了很大的增强,在确保静态类型安全的同时大幅提升了语言表达力。 那么本文就按照方向从 5 个大 阅读全文
posted @ 2022-07-10 00:11 hez2010 阅读(9025) 评论(32) 推荐(60)
摘要:前言 自从 2017 年 C# 7.0 版本开始引入声明模式和常数模式匹配开始,到 2022 年的 C# 11 为止,最后一个板块列表模式和切片模式匹配也已经补齐,当初计划的模式匹配内容已经基本全部完成。 C# 在模式匹配方面下一步计划则是支持活动模式(active pattern),这一部分将在本 阅读全文
posted @ 2022-03-04 11:03 hez2010 阅读(8574) 评论(19) 推荐(33)
摘要:前言 开头防杠:.NET 的基础库、语言、运行时团队从来都是相互独立各自更新的,.NET 6 在基础库、运行时上同样做了非常多的改进,不过本文仅仅介绍语言部分。 距离上次介绍 C# 10 的特性已经有一段时间了,伴随着 .NET 6 的开发进入尾声,C# 10 最终的特性也终于敲定了。总的来说 C# 阅读全文
posted @ 2021-08-12 16:35 hez2010 阅读(18172) 评论(42) 推荐(70)
摘要:引子 .NET 6 开始初步引入 PGO。PGO 即 Profile Guided Optimization,通过收集运行时信息来指导 JIT 如何优化代码,相比以前没有 PGO 时可以做更多以前难以完成的优化。 下面我们用 .NET 6 的 nightly build 版本 6.0.100-rc. 阅读全文
posted @ 2021-07-28 13:38 hez2010 阅读(9233) 评论(33) 推荐(71)
摘要:C# 10 主要特性一览 阅读全文
posted @ 2021-06-06 20:54 hez2010 阅读(7380) 评论(21) 推荐(38)
摘要:前言 2021/4/8 .NET 6 Preview 3 发布,这个版本的改进大多来自于底层,一起来看看都有什么新特性和改进吧。 库改进 新增值类型作为字典值时更快的处理方法 .NET 6 Preview 3 引入了新的 unsafe API CollectionsMarshal.GetValueR 阅读全文
posted @ 2021-04-09 14:11 hez2010 阅读(5758) 评论(25) 推荐(38)