IntPtr
は で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
構造体は非常に「軽量」で、おそらく非常に簡単に作成できると思います。
また、Marshal
.NET フレームワークのクラスでは、 Marshal.ReadInt64IntPtr
などの値渡しが行われます。クラスは可能な限り低いレイテンシになるように設計されていると思いますが、なぜ参照渡しされないのでしょうか?Marshal
IntPtr
- IntPtr を値または参照で渡す方が速いでしょうか?
- 参照渡しの方が速い場合、
Marshal
クラスがIntPtr
値渡しするのはなぜですか?