展开菜单
首页 精品内容 本月促销 装机必备 Windows macOS软件 IOS软件 Android AI PDF教程 专题
全部分类

当前位置:

首页 > 编程开发 > C# 内存安全性的重大演进:重新定义 unsafe 关键字

C# 内存安全性的重大演进:重新定义 unsafe 关键字

导读:.NET 产品经理 Richard Lander 披露了 C# 16 与 .NET 11/12 的核心蓝图——在不丢失 GC 的前提下,让 C# 在底层内存控制上更接近 Rust 的安全保障。 TL;DR 先把变革的核心思路说清楚:把「指针」从洪水猛兽变成可控工具,把真

导读:.NET 产品经理 Richard Lander 披露了 C# 16 与 .NET 11/12 的核心蓝图——在不丢失 GC 的前提下,让 C# 在底层内存控制上更接近 Rust 的安全保障。

C# 内存安全性的重大演进:重新定义 unsafe 关键字

TL;DR

先把变革的核心思路说清楚:把「指针」从洪水猛兽变成可控工具,把真正的危险精确到「解引用」这一刀。

几个关键数据点:

  • .NET 11 预览版 → .NET 12 生产就绪
  • 新模型代号:MemorySafetyRules 1
  • 目标:让 C# 获得「近似 Rust」的内存安全,而非引入完整的借用检查器

一、问题的根源:旧的 unsafe 太粗糙

1.1 旧模型的「冤案」

在经典 C# 里,只要用了 int* 这类指针,就得套一层 unsafe 大括号。这种做法,怎么说呢,有点过度了

拿几个典型案例来说:

  • 声明一个指针 int* p = &value; —— 编译器直接红牌,判定为非安全操作
  • 但调个 Marshal.AllocHGlobal() —— 居然是「安全」的?

这种「内外不一致」让代码审计变成了真·扫雷游戏

表面风平浪静,内部暗流涌动。

1.2 新模型的「翻案」

新规则把「非安全」的判定从「用指针」改成了「解引用非托管内存」。这一下就把目标锁定了。

操作旧模型新模型
int* p = &value;❌ 必须 unsafe✅ 安全
fixed (buf) 获取栈数组❌ 必须 unsafe✅ 安全
*p = 42; 解引用✅ 可以安全❌ 必须 unsafe
stackalloc Span 未初始化❌ 被「误杀」✅ 精准识别

二、stackalloc 的三条件:真危险的精确定位

这可以说是新模型最具技术含量的突破点。只有同时满足以下三个条件时,stackalloc 才会被判定为 unsafe:

  • 隐式转 Span:被转换成 SpanReadOnlySpan
  • 无初始化列表:没用 stackalloc int buf[4] = {1,2,3,4}
  • 在 SkipLocalsInitAttribute 成员内:内存暴露未初始化垃圾数据

一句话概括:精准锁定物理危险区域,不伤及无辜。

三、LDM 核心决策(2026年5月13日)

语言设计组的最新拍板,都落到了实处:

3.1 safe 关键字

不用 SafeRuntime 那种元数据属性,直接引入 safe 上下文关键字

safe {
    // 这里面的代码经过编译器安全审计
}

3.2 类型声明上的 unsafe

直接标为编译期错误

unsafe class MyClass { }  // ❌ 废弃!

正确姿势:在具体成员上标记

3.3 字段的 unsafe

字段可以单独标记 unsafe

unsafe struct Buffer {
    unsafe byte* Data;  // ✅ 读取时需要 unsafe 上下文
}

3.4 签名与实现的解耦

这是最重磅的设计变更:

旧模型新模型
方法签名标 unsafe → 方法体全程 unsafe签名 unsafe = 仅外部契约 ✓
无法区分「对外承诺」vs「内部实现」内部仍受编译器安全保护 ✅
// 新模型下:
unsafe void ProcessBuffer(byte* ptr) {
    // 签名不安全?但方法体内部可以是安全的!
    
    // 只有真的解引用时才需要 unsafe 块
    unsafe {
        *ptr = 42;
    }
}

3.5 过渡期诊断

为了避免「升级空窗期」,编译器考虑得挺周到:

  • 没开启新模型的代码调用新版指针成员?
  • 调用方不在 unsafe 上下文?

编译警告/错误,给你慢慢迁移的时间。

四、ref 安全性的「逃生通道」

ref 安全性分析一向很保守,经常误杀一些「实则安全」的代码。新模型在 unsafe 上下文中做了降级处理

原先新模型
硬性编译错误⚠️ 警告
无法绕过需要三层确认:
  • 开启 /unsafe
  • 声明 unsafe 上下文
  • 显式压制警告

这就是「打破玻璃」的合法通道。

五、C# vs Rust:Runtime 的根本分歧

         .NET 垃圾回收器
    (自动且不确定性地管理内存)
              ↑
     [高性能路径]
              ↓
+------------------+    +------------------+
| 次级引用下行借用 |    | ArrayPool 复用  |
| (ref struct /   |    | (无仿射所有权,  |
|  生命周期单向栈传) |    | 面临二次释放隐患)|
+------------------+    +------------------+

Rust 靠的是所有权+生命周期+借用检查器 → 完全静态保障。

C# 必须走另一条路:次级引用(Second-class References)

「只能往下传,不能存堆上」—— 低追踪成本实现高强度安全。

但这也暴露了短板:ArrayPool 的归还无法阻止二次访问

六、生态迁移:三张表

6.1 P/Invoke 迁移

旧模式新模式
IntPtr 伪装指针,无 unsafe原生方法导入标记 unsafe 契约 ✅

动作IntPtr/nintbyte*/void* 重构。

6.2 数组/栈缓冲区

旧模式新模式
全局 unsafe 方法体局部 unsafe { } 块隔离 ✅

替代方案:优先使用 Span 或 C# 12 内联数组。

6.3 显式布局联合体

旧模式新模式
隐式重叠,缺乏审计必须显式标注 safe/unsafe ✅

七、架构设计建议

三条落地准则,值得在实践中参考:

① 互操作隔离层

  • 所有 P/Invoke、非托管封装 → 独立底层程序集
  • 开启 1 强制内部升级

② 局部化 unsafe

  • 丢弃「整方法 unsafe」的惯性思维
  • 只在最关键的解引用那几行unsafe { }

配合文档标签:

/// 
/// 调用前必须确保 ptr 指向有效且已初始化的内存
/// 
unsafe byte* ProcessBuffer(byte* ptr);

③ 优先托管替代

能用 Span 就别用裸指针。

JIT 编译器对 Span 的边界检查消除已足够成熟,性能不输裸指针。

结语

这场演进的核心不是「让 C# 变成 Rust」,而是让内存安全的边界从「暴力圈地」变成「精准灌溉」

  • 把真正的危险留给开发者自己决定
  • 把「无害声明」从不必要的管控中解放出来
  • 给足「逃生通道」,但要求你清醒

.NET 11 预览在望,.NET 12 生产就绪。

你的 unsafe 代码,准备好迎接新十年了吗?

本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
编程开发
相关文章 更多
精品专题 更多
本月促销

正软商城本月促销专区,汇集办公、设计、安全、影音、系统工具及AI软件等正版软件优惠活动,提供限时折扣、特价授权和优惠购买信息,活动库存及价格以页面实时展示为准。

装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

IOS软件

正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

AI

正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
灵活计算器
灵活计算器

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

图几
图几

图几是一款适用于 macOS 的截图、标注与美化工具,支持离线操作保障隐私。界面整理和高频系统操作被放到一起考虑,桌面或窗口内容一多时,管理起来会更省心。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Menuist
Menuist

Menuist 是一款面向 macOS 的 Finder 右键菜单增强工具,主要用来补充新建文件、快捷导航等常用操作,让日常文件管理和访问路径时更高效、更顺手。

Mole
Mole

Mole 是一款专为 Mac 设计的深度清理优化工具,涵盖缓存清理、应用管理及实时状态监控等功能。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

WINDOWS 更多
Windows 10
Windows 10

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

傲梅轻松备份
傲梅轻松备份

傲梅轻松备份是一款专业易用的数据备份软件,为重要数据提供安全保障。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

Wise Folder Hider Pro
Wise Folder Hider Pro

Wise Folder Hider Pro 是一款专业级文件和文件夹隐藏加密软件,为私密数据添加多重保护。高频操作更强调就近处理,浏览、整理和跨目录移动文件时,来回切换和重复点击都会少很多。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

PinStack
PinStack

PinStack是一款轻量级的Windows平台剪贴板管理工具,优化您的剪贴板使用体验。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Seer
Seer

Seer是一款在Win平台下的空格键功能增强效率工具,只需轻敲空格键,就能预览几乎任何格式的文件。它更适合把零散的小功能集中起来使用,处理高频琐碎任务时会更省事。