ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

MemoryT

2026/8/4 13:40:32 拓冰建站 浏览量
MemoryT

Span 很快,但它像一张便利贴——只能贴在桌上(方法内部)看,不能折起来放进口袋带走,也就是说它不能跨 await 用在异步方法里。
Memory 把数据装进一个信封里,你可以随身带着走(存到字段里、跨 await 使用),需要看的时候打开信封,用 .Span 取出里面的内容来看。

————————————————————————————————————————————————————————————————————————————————————————————————

案例 1:基础切片(和 Span 很像)
csharp
int[] numbers = { 10, 20, 30, 40, 50 };
Memory mem = numbers;
Memory slice = mem.Slice(1, 3); // 切出 20,30,40

foreach (int n in slice.Span)
Console.Write(n + " ");
// 输出:20 30 40
Slice 切一块,slice.Span 打开信封看内容。不复制原数组。

————————————————————————————————————————————————————————————————————————————————————————————————

案例 2:异步读文件(Memory 的主场)
csharp
async Task ReadAsync()
{
byte[] buffer = new byte[64];
Memory mem = buffer; // 装进信封

using var stream = File.OpenRead("test.txt");
int n = await stream.ReadAsync(mem); // 跨 await 使用!

string text = Encoding.UTF8.GetString(mem.Span.Slice(0, n));
Console.WriteLine(text);
}
Span 不能当参数传给 await,但 Memory 可以。这是它最核心的用途。

————————————————————————————————————————————————————————————————————————————————————————————————

案例 3:字符串切片(只读信封)
csharp
string date = "2024-08-02";
ReadOnlyMemory mem = date.AsMemory();

string year = mem.Slice(0, 4).ToString();
string month = mem.Slice(5, 2).ToString();

Console.WriteLine($"{year}年{month}月"); // 2024年08月
ReadOnlyMemory 是只读信封,适合处理字符串。比直接 Substring 更省内存。