C#面试题更新 2026-08-05

请说明 .NET 中 Span 和 Memory 在内存操作优化上的具体用法和区别。

性能优化技术原理方案权衡C#.NET

考察说明

考查对 .NET 中 Span 和 Memory 的理解,包括其用途、区别及应用场景。

回答思路

  1. 【回答框架 1】Span 是栈上的值类型,只能存储于栈上,不能装箱,也不能作为类的字段使用,主要用于同步方法内的数组切片、字符串片段等操作,提供高效的内存访问,避免额外分配。
  2. 【回答框架 2】Memory 是引用类型,可以存储在堆上,可以用于异步方法、类字段等跨方法传递的场景,因为异步方法中不能使用 Span。Memory 提供更灵活的用法,但性能上略逊于 Span。
  3. 【回答框架 3】使用示例:对于数组或字符串,可以通过 AsSpan 或 AsMemory 方法获得 Span 或 Memory,然后进行切片、遍历、修改等操作,而无需复制数据。
  4. 【回答框架 4】在性能敏感场景,如解析协议、处理大文件或字符串处理时,优先使用 Span 以减少分配和复制;而在需要存储或异步场景时,则使用 Memory。
  5. 【关键点 1】Span 是值类型,不能用于异步方法和字段。
  6. 【关键点 2】Memory 是引用类型,可用于异步和字段。
  7. 【关键点 3】Span 和 Memory 都提供无复制切片能力。
  8. 【关键点 4】基于 stackalloc 或原生内存时只能使用 Span。
  9. 【易错点 1】Span 无法在异步方法中使用,若误用会导致编译错误。
  10. 【易错点 2】Memory 虽然可在异步中使用,但需注意其生命周期和所有权,避免在方法返回后仍持有引用导致潜在问题。
  11. 【易错点 3】不要将 Span 作为类的字段,因为 Span 是 ref struct,不能装箱。