一、ReadOnlySequence 概述ReadOnlySequenceT是 .NET Core 3.0 引入的核心类型,位于System.Buffers命名空间,用于高效处理可能跨多个内存段(segment)的连续数据。它主要解决两个问题:避免大对象分配:将大数据分散到多个缓冲区支持零拷贝解析:协议解析时无需复制数据// 基本结构:可能由多个内存段组成 // [Segment1] - [Segment2] - [Segment3] - ...二、核心构造方式2.1 从单个数组/内存创建byte[] data = new byte[1024]; ReadOnlySequencebyte sequence1 = new ReadOnlySequencebyte(data); ReadOnlySequencebyte sequence2 = new ReadOnlySequencebyte(data.AsMemory(0, 512));2.2 从多个 Segment 创建(核心场景)var segment1 = new BufferSegment(new byte[100]); var segment2 = new BufferSegment(new byte[200]); segment1.SetNext(segment2); var sequence = new ReadOnlySequencebyte(segment1, 0, segment2, 200);2.3 从 IMemoryOwner 创建using IMemoryOwnerbyte owner = MemoryPoolbyte.Shared.Rent(4096); var sequence = new ReadOnlySequencebyte(owner.Memory);三、多段内存遍历机制3.1 内部结构:SequenceSegment// 简化的内部实现概念 internal abstract class SequenceSegmentT { public MemoryT Memory { get; } public SequenceSegmentT Next { get; } public long RunningIndex { get; } // 全局索引位置 }3.2 核心遍历方法方法1:使用 SequenceReader(推荐)public static void ParseWithReader(ReadOnlySequencebyte sequence) { var reader = new SequenceReaderbyte(sequence); while (!reader.End) { if (reader.TryReadTo(out ReadOnlySpanbyte line, (byte)'\n')) { ProcessLine(line); } } }方法2:手动遍历 Segmentpublic static void WalkSegments(ReadOnlySequencebyte sequence) { var position = sequence.Start; while (sequence.TryGet(ref position, out ReadOnlyMemorybyte segment)) { Console.WriteLine($"Segment: {segment.Length} bytes"); ProcessSegment(segment.Span); } }方法3:统一访问(自动处理连续/非连续)public static void UnifiedAccess(ReadOnlySequencebyte sequence) { if (sequence.IsSingleSegment) { // 单段:直接访问 ProcessSpan(sequence.First.Span); } else { // 多段:遍历处理