我正在解析一个任意长度的字节数组,该数组将传递给一些不同的解析层。就像任何普通的封装一样,每个解析器都会创建一个Header和Packet负载。

我的问题在于封装如何保持其数据包字节数组有效负载。假设我有一个具有三个封装级别的100字节数组。将创建三个数据包对象,我想将这些数据包的有效负载设置为数据包字节数组中的相应位置。

例如,假设所有级别的有效负载大小为20,然后想象每个对象上都有一个public byte[] Payload。但是,问题在于此byte[] Payload是原始100字节的副本,因此我将在内存中以160字节而不是100字节结束。

如果它是用C++编写的,那么我可以轻松地使用一个指针-但是,我是用C#编写的。

因此,我创建了以下类:

public class PayloadSegment<T> : IEnumerable<T>
{
    public readonly T[] Array;
    public readonly int Offset;
    public readonly int Count;

    public PayloadSegment(T[] array, int offset, int count)
    {
        this.Array = array;
        this.Offset = offset;
        this.Count = count;
    }

    public T this[int index]
    {
        get
        {
            if (index < 0 || index >= this.Count)
                throw new IndexOutOfRangeException();
            else
                return Array[Offset + index];
        }
        set
        {
            if (index < 0 || index >= this.Count)
                throw new IndexOutOfRangeException();
            else
                Array[Offset + index] = value;
        }
    }

    public IEnumerator<T> GetEnumerator()
    {
        for (int i = Offset; i < Offset + Count; i++)
            yield return Array[i];
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        IEnumerator<T> enumerator = this.GetEnumerator();
        while (enumerator.MoveNext())
        {
            yield return enumerator.Current;
        }
    }
}

这样,我可以简单地引用原始字节数组中的一个位置,但是使用位置索引。但是,如果我做类似的事情:
 PayloadSegment<byte> something = new PayloadSegment<byte>(someArray, 5, 10);
 byte[] somethingArray = something.ToArray();
somethingArray是字节的副本,还是对原始PayloadSegment的引用(反过来又是对原始字节数组的引用)?

编辑:实际上,在重新考虑之后,我不能简单地使用新的MemoryStream(array, offset, length)吗?

最佳答案

Enumerable.ToArray扩展方法的文档没有特别提及传递经过恰好是数组的序列时的操作。但是,对.NET Reflector进行的简单检查显示,它确实确实创建了该数组的副本。

但是,值得注意的是,当给定实现ICollection<T>的序列(Array可以实现)时,由于可以预先知道元素的数量,因此可以更快地完成复制,因此不必像List<T>那样对缓冲区进行动态调整大小。 。

关于c# - IEnumerable <T> ToArray用法-是副本还是指针?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2680359/

10-15 04:48