C# で独自の循環バッファーを作成しようとしています。次のアイテムを挿入する必要がある場所を追跡するためにカウンターを使用しています。これは完全なコードへのリンクであり、これを行うための(簡略化された)コードは次のとおりです。
public class CircularBuffer<T>
{
private bool _isFull = false;
private int _size;
private int _current = 0;
private BufferItem<T>[] _buffer;
public CircularBuffer(int size)
{
_size = size;
_buffer = new BufferItem<T>[size];
}
public void Insert(T value)
{
BufferItem<T> item = new BufferItem<T>(value);
//Removed code to check if the buffer is full, if so over-write the oldest item
//and don't insert at the current position
_buffer[_current] = item;
_isFull = (_current == (_size - 1));
_current++;
//Age all items
}
現在の位置をインクリメントして別のアイテムを追加しようとするまで、すべて正常に機能します。
ここでアイテムを追加する"first"
と、現在の位置 ( _current
) がインクリメントされます。
アイテムを追加しましたが、現在の位置が 0 にリセットされます。宣言、アクセス、インクリメント以外"third"
のコードはまったくありません。_current
世界で何が起こっているのですか?のコードは次のBufferItem<T>
とおりです。
public class BufferItem<T>
{
public int Age = 0;
public T Item;
public BufferItem(T item)
{
Item = item;
}
}