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;
            }
        }

 

posted @ 2025-05-27 16:19  WmW  阅读(58)  评论(0)    收藏  举报