如何在不分配新内存的情况下删除部分数组?

时间:2012-03-15 12:32:55

标签: c#

我有字节数组。我需要删除前4个字节,如:

byte[] newArray = new byte[byteArray.Length - 4];
Buffer.BlockCopy(byteArray, 4, newArray, 0, byteArray.Length - 4);

但我可以用C / C ++风格移动指针吗? :

byte[] byteMsg = byteArray + 4;

我不想在绝对需要之前分配额外的内存,因为这段代码经常被执行。

upd:我从Socket接收数据,所以我可能应该使用另一个版本的Receive count = s.Receive(byteArray);

3 个答案:

答案 0 :(得分:4)

不,你不能这样做。 .NET数组总是固定大小,你不能在不安全的代码之外对其进行指针运算。

尝试使用ArraySegment代替

答案 1 :(得分:0)

我不担心,如果没有被引用,GC会负责清理你不再使用的内存。

C#中的数组是不可变的。你不能修改它们,所以如果你需要删除前4个字节,那么你将不得不重新分配。正如thecoop建议的那样,我会看看ArraySegment并使用它传递给其他函数,如果前4个字节对你来说并不重要。

同样值得注意的是,在C ++中,我们使用了一些指针算法,但绝对保持原始指针,减少我们最终取消分配并丢失4个字节给恶魔:)

答案 2 :(得分:0)

保持Byte数组不变,并使用MemoryStream及其偏移功能。这不会改变你的数组,你可以跳过前n个字节。

var memoryStream = new MemoryStream(byteArray);
// do whatever you want with the memory stream