C# ポインタ

C# では、ポインタを使用してオブジェクトへアクセスするには、まずメモリアドレスを特定する必要があります。ところが、ガベージコレクションのために、オブジェクトへのアクセス中にメモリアドレスが変化しないとは限りません。そこで、キーワード fixed を用います。このキーワードにより、ガベージコレクションによって変更されないメモリアドレスへのポインタを取得することができます。

// unsafe キーワードがメソッドに付く
public unsafe int Read(byte[] buffer, int index, int count)
{
  int bytesRead = 0;
  fixed (byte* bytePointer = buffer) // fixed キーワード
  {
    ReadFile(
      fileHandle,
      bytePointer + index, // メモリアドレスの計算
      count,
      &bytesRead,
      0);
  }
  return bytesRead;
}