C# ReadOnlySequence和ReadOnlySequenceSegment简单使用
ReadOnlySequence可以将若干非连续的内存当作连续内存使用,就是用起来比较麻烦,今天先简单的研究一下,
public static void Start() { //抽象类ReadOnlySequenceSegment的实现,表示一个只读序列段 var first = new MemorySegment<byte>(new byte[] { 1, 2, 3, 4, 5 }); var second = first.Append(new byte[] { 6, 7, 8, 9, 10 }); var end = second.Append(new byte[] { 11, 12, 13, 14, 15 }); //想要实现连接多个数组,只能通过ReadOnlySequenceSegment,且需要传入第一个和最后一个 var sequence = new ReadOnlySequence<byte>(first, 0, end, end.Memory.Length); //var cccc = sequence.Slice(7); //通过SequenceReader读取数据 SequenceReader<byte> reader = new(sequence); reader.TryRead(out byte value); //读一个字节 reader.TryReadExact(3, out ReadOnlySequence<byte> ros); //读3个字节 byte[] arr = new byte[3]; reader.TryCopyTo(arr); //将未读的数据拷贝到arr中,已读下标不会移动 reader.TryRead(out byte value1); //TryCopyTo不会导致已读,value1为5 reader.Advance(3); //前进3个字节,加上读取value1,下标移动共4个 reader.TryRead(out byte value2); //value为9 } /// <summary> /// ReadOnlySequenceSegment为抽象类,需要自己是新啊 /// </summary> public class MemorySegment<T> : ReadOnlySequenceSegment<T> { public MemorySegment(ReadOnlyMemory<T> memory) { Memory = memory; //RunningIndex = 1024; //测试RunningIndex是否会影响SequenceReader读取,结果是没影响 } public MemorySegment<T> Append(ReadOnlyMemory<T> memory) { var segment = new MemorySegment<T>(memory) { //当前节点之前的节点长度之和,目前没搞清楚它具体有什么作用,可能只要是连续的就行 //即使将其弄乱,也不会影响读取,但是如果不设置,就会导致reader.TryCopyTo(arr)出问题 //RunningIndex = 3, //RunningIndex = RunningIndex + Memory.Length + 2, RunningIndex = RunningIndex + Memory.Length, }; Next = segment; //当前段关联的下一个段 return segment; } }
                    
                
                
            
        
浙公网安备 33010602011771号