IntPtr
是 a struct
,所以默认情况下是按值传递的,这可能会很昂贵(因为每次都会创建新对象),所以当新对象不是强制性的时,我们最好通过引用传递它。例如我写了这样的代码(请忽略硬编码的“幻数”):
public static DateTime IntPtrToDateTime(ref IntPtr value, int offset)
{
short year = Marshal.ReadInt16(value, offset);
byte month = Marshal.ReadByte(value, offset + 2);
byte day = Marshal.ReadByte(value, offset + 3);
byte hour = Marshal.ReadByte(value, offset + 4);
byte minute = Marshal.ReadByte(value, offset + 5);
byte second = Marshal.ReadByte(value, offset + 6);
short msec = Marshal.ReadInt16(value, offset + 8);
return new DateTime(year, month, day, hour, minute, second, msec);
}
工作正常,但我怀疑我是否真的应该通过引用传递 IntPtr?我猜IntPtr
struct 非常“轻”并且可能很容易创建。
同样在Marshal
.NET 框架中的类中IntPtr
通过值传递,例如Marshal.ReadInt64我猜Marshal
类被设计为尽可能低的延迟,但是为什么IntPtr
不通过引用传递呢?
- 什么会更快 - 通过值或引用传递 IntPtr?
- 如果按引用传递更快,那么为什么
Marshal
类IntPtr
按值传递?