このC#コードを想定します。
_using (MemoryStream stream = new MemoryStream())
{
StreamWriter normalWriter = new StreamWriter(stream);
BinaryWriter binaryWriter = new BinaryWriter(stream);
foreach(...)
{
binaryWriter.Write(number);
normalWriter.WriteLine(name); //<~~ easier to reader afterward.
}
return MemoryStream.ToArray();
}
_
私の質問は次のとおりです。
MemoryStream.ToArray()
を返すことは合法ですか?慣例としてusing
-blockを使用していますが、混乱するのではないかと思います。前の答えをスクラッチします-同じストリームの周りに2つのラッパーを使用していることに気づいていませんでした。それは私にはいくぶん危険を感じます。
いずれにせよ、私はStreamWriter
とBinaryWriter
をそれぞれのusing
ブロックに配置します。
そうです、MemoryStream
でToArray()
を呼び出すことは合法です。データは破棄された後も保持されます。
本当に2つのラッパーを使用したい場合は、次のようにします。
_using (MemoryStream stream = new MemoryStream())
{
using (StreamWriter normalWriter = new StreamWriter(stream))
using (BinaryWriter binaryWriter = new BinaryWriter(stream))
{
foreach(...)
{
binaryWriter.Write(number);
binaryWriter.Flush();
normalWriter.WriteLine(name); //<~~ easier to read afterward.
normalWriter.Flush();
}
}
return MemoryStream.ToArray();
}
_
ただし、同じストリームの周りに2つのラッパーを使用することには多少注意が必要です。奇数のデータになってしまわないように、各操作の後にそれぞれをフラッシュし続ける必要があります。 StreamWriter
の- AutoFlush
プロパティをtrueに設定して状況を緩和することができ、IbelieveBinaryWriter
は現在実際にはフラッシュを必要としません(つまり、データをバッファリングしません)が、それに依存するのは危険だと感じます。
バイナリデータとテキストデータを混在させる必要がある場合は、BinaryWriter
を使用し、文字列のバイトを明示的に書き込み、Encoding.GetBytes(string)
でフェッチします。
更新
この答えを気にしないでください、私は作家と混乱しました...