针对特殊需要时修改比较方便。
using System;
public class FIFO

...{
private object[] _Buffer;
private float _Grow;
private int _Head;
private int _Tail;
private int _ItemCount;

public int Count ...{ get ...{ return this._ItemCount; } }

public FIFO(int BufferSize, float Grow)

...{

if (BufferSize < 0) ...{ throw new ArgumentOutOfRangeException(); }

if (Grow < 1 || Grow > 10) ...{ throw new ArgumentOutOfRangeException(); }
this._Buffer = new object[BufferSize];
this._Grow = Grow;
}

public FIFO() : this(32, 2) ...{ }

void ChangeBufferSize(int Size)

...{
object[] newbuf = new object[Size];
if (this._ItemCount > 0)

...{
if (this._Head < this._Tail)

...{
Array.Copy(this._Buffer, this._Head, newbuf, 0, this._ItemCount);
}
else

...{
Array.Copy(this._Buffer, this._Head, newbuf, 0, this._Buffer.Length - this._Head);
Array.Copy(this._Buffer, 0, newbuf, this._Buffer.Length - this._Head, this._Tail);
}
}
this._Buffer = newbuf;
this._Head = 0;
this._Tail = this._ItemCount;
}
public void PUT(object obj)

...{
if (this._ItemCount == this._Buffer.Length) //空间不足

...{
int newSize = (int)(this._Buffer.Length * this._Grow);
if (newSize < (this._Buffer.Length + 4)) newSize = this._Buffer.Length + 4;
this.ChangeBufferSize(newSize);
}
this._Buffer[this._Tail] = obj;
this._Tail = (this._Tail + 1) % this._Buffer.Length;
this._ItemCount++;
}
public object GET()

...{

if (this._ItemCount == 0) ...{ throw new InvalidOperationException(); }
object ret = this._Buffer[this._Head];
this._Buffer[this._Head] = null;
this._Head = (this._Head + 1) % this._Buffer.Length;
this._ItemCount--;
return ret;
}
}
技术讨论的QQ群: 2514097 或 10987609