"One Shot"属性Getters被认为是.NET(或一般)中可接受的编码标准

Eoi*_*ell 5 .net c# activemq-classic properties

最近在使用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)
}
Run Code Online (Sandbox Code Playgroud)

InitialiseReading方法处理从活动MQ到.dataIn字段的数据的连接和流传输.但问题在于它每天都有这个问题.一旦读取了数据,就无法再次读取数据并且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.
Run Code Online (Sandbox Code Playgroud)

或者在您进行调试时,您在该属性上粘贴了一个监视变量,或者意外地将鼠标悬停在该属性上.

这种机制是使用流数据属性的公认或流行方式吗?

Jam*_*iec 6

非常非常差的代码.

一般的智慧是属性不应该影响对象的内部状态.如果你调用set,那么你应该总是得到你刚刚设置的值.如果你打电话给twicwe,你应该得到两次相同的结果.

这应该是一个GetContent至少被调用的方法,但id仍然期望能够重复调用该方法并获得相同的结果.