Span
Memory
————————————————————————————————————————————————————————————————————————————————————————————————
案例 1:基础切片(和 Span 很像)
csharp
int[] numbers = { 10, 20, 30, 40, 50 };
Memory
Memory
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
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
string year = mem.Slice(0, 4).ToString();
string month = mem.Slice(5, 2).ToString();
Console.WriteLine($"{year}年{month}月"); // 2024年08月
ReadOnlyMemory 是只读信封,适合处理字符串。比直接 Substring 更省内存。
