最近、C# と ActiveMQ を (Apache.NMS ライブラリ経由で) 使用しているときに、次のプロパティに出くわしました。ActiveMQBytesMessage
public new byte[] Content
{
get
{
byte[] buffer = (byte[]) null;
this.InitializeReading();
if (this.length != 0)
{
buffer = new byte[this.length];
this.dataIn.Read(buffer, 0, buffer.Length);
}
return buffer;
}
..(setter omitted)
}
InitialiseReading
メソッドは、アクティブな MQ から.dataIn
フィールドへのデータの接続とストリーミングを処理しました。問題は、ITが毎回これを行ったことです。そして、そのデータが読み取られると、二度と読み取ることができず、dataIn フィールドはゼロになってリセットされました。したがって、単にプロパティを観察して再度観察するだけで、データが失われます。これにより、次のような非常に奇妙なバグが発生しました。
byte [] myBytes = new byte[msg.Content.Length];
//Touched the property. Data read in.
msg.Content.CopyTo(myBytes,0);
//Uh oh! touched it again, copying a zero'd array.
または、デバッグ中にウォッチ変数をプロパティに固定したり、誤ってマウスをプロパティの上に置いたりした場合。
この種のメカニズムは、ストリーミングされたデータのプロパティを使用する方法として受け入れられているか、または普及していますか?