固定長さな MemoryStream

MemoryStream のコンストラクタのオーバーロードは、すべて固定長の MemoryStream を作成するためにある。
固定長の MemoryStream を作成するためには、かならずバッキングストアとなる固定長のバイト列をコンストラクタに指定する必要がある。
各コンストラクタで作成された MemoryStream の挙動については、それぞれのコンストラクタの説明にきっちり記述されている。

// 1M bytes のバイト列
byte[] store = new byte[1024 * 1024];

// 上記の 1M bytes に書き込むことが可能な MemoryStream を作成
MemoryStream ms2 = new MemoryStream(store, true);

// 上記の 1M bytes のうち、先頭から 5k bytes 目から 1kbytes を読み書きする
// MemoryStream を作成する。
MemoryStream ms3 = new MemoryStream(store, 1024 * 5, 1024);

// ms2 のバッキングストア、つまり同じ store の上の先頭から 5k bytes に対して
// 読み取り専用のストリームを作成する。また ms4 は GetBuffer() を許可する。
//     ※ このコードは ms2 が GetBuffer() を許可しないため失敗する
MemoryStream ms4 = new MemoryStream(ms2.GetBuffer(), 0, 5 * 1024, false, true);