C#とポインタ

今回書いているEDIDリーダーは物としてはbinaryリーダーで、128バイトのEDID情報の各バイト(もしくは、複数バイト)を定義に従いそれぞれ意味合いの異なるデータとして解釈していく。
例えばこんな感じである、言語はC#である。


// EDIDHeader
byteEDIDBuffer = new byte[SIZE_EDID_HEADER];
Buffer.BlockCopy(arrayEDID, EDIDOffset, byteEDIDBuffer, 0, SIZE_EDID_HEADER);
edidHeader = new EDIDHeader(byteEDIDBuffer);
EDIDOffset += SIZE_EDID_HEADER;
arrayEDIDは128バイトのEDID情報を保持しているbyte型の変数で、EDIDHeaderはEDIDのヘッダー情報を解釈するクラスである。

これがもしC++なら、こう実装するだろう。


// EDIDHeader
edidHeader = new EDIDHeader(arrayEDID);
arrayEDID += SIZE_EDID_HEADER;
なにが違うかといえば、引数で渡すものである。
C#では、byte型配列の参照を引き渡しているが、C++ではbyte型配列のポインタを引き渡している。

こういった処理では、iバイト目からj-1バイト目は処理Aを、jバイト目からk-1バイト目は処理Bを・・・ということを繰り返す。
もともとの情報に手を加えない限りは、C++ならばそれぞれの処理にiバイト目、jバイト目・・・とポインタのみを引き渡せばよい(arrayEDID)。
しかし、C#ではポインタが使えない(というか、fixedしないかぎりコンパイル後の変数や関数のポインタが固定されない)ので、いちいちバッファーにiバイト目からj-1バイト目までのデータをコピーして(Buffer.BlockCopy...の行)、それぞれの処理に参照を引き渡す(byteEDIDBuffer)、ということをしなくてはならない。


C#で(小さい手習い以外の)開発をしたのは今回が初めてであった。
コードはかなり早く書けたし、リファクタリングは大変楽であった。
#筆者は個人プロジェクトではまともな設計をせずにどんどんコードを書く、アジャイルだと言い訳しておこう
生産性は、かなりよいと思う。
ただこんなところは、ちょっと残念だ。