我正在尝试创建一个属性,它将从我的字节数组(byte[])创建一个指针( byte *),这确实有效,但是每当我修改这个返回的指针时,我的字节数组将不会被修改,这是我想要使用的一段代码。
public unsafe class PacketWriter
{
private readonly byte[] _packet;
private int _position;
public byte* Pointer
{
get
{
fixed (byte* pointer = _packet)
return pointer;
}
}
public PacketWriter(int packetLength)
{
_packet = new byte[packetLength];
}
//An example function
public void WriteInt16(short value)
{
if (value > Int16.MaxValue)
throw new Exception("PacketWriter: You cannot write " + value + " to a Int16.");
*((short*)(Pointer + _position)) = (short) value;
_position += 2;
}
//I would call this function to get the array.
public byte[] GetPacket
{
get { return _packet; }
}
}此外,我意识到我可以简单地删除属性并将代码放入函数中,这可能会起作用,但我正在试图找出使用该属性的方法-除非这会降低性能,在这种情况下请让我知道。
发布于 2010-10-12 22:05:40
在这里使用指针(在C#中)是没有意义的。
请注意,如果将Pointer属性替换为
public byte[] Data { get { return _packet; } }您有一个返回对字节数组的引用的属性,它将允许您在数组中执行与指针相同的编辑操作,而无需在任何时候复制数组。
另一条建议,在你的Write16中,使用:
byte[] data = BitConverter.GetBytes(value);
data.CopyTo(_packet, _positiion);
_position += data.Length;发布于 2010-10-12 21:40:04
当你的控件离开fixed时(它在返回后立即离开),你的对象不再被固定。所以它只在fixed内部有效
发布于 2010-10-12 22:27:13
不要暴露指针。你正在先发制人地优化你的代码。举个例子,我用C#为我正在做的一个项目写了一个PNG解码器,而不是假设瓶颈,我写的代码让管理数据结构变得微不足道,并且对I/O和数据移动相当轻松。在对代码进行基准测试时,瓶颈不在数据移动或I/O中,而是在Paeth预测器中-以像素为基础进行的计算(详细信息here)。
首先编写可读性和可维护性的代码,然后看看瓶颈在哪里。你可以在以后重构它。
https://stackoverflow.com/questions/3915287
复制相似问题