C# 固定大小的缓存

时间:2021-10-30 18:18:29

有时候需要把最新的N条记录暂时存起来供需要的时候调用,C#有没有指针,怎么办呢咱利用数组和byte字节整一个类:

    public class Buffer<T>
{
private T[] _TS;
private byte _Index = ;
private int _Capcity;
public Buffer(int capcity)
{
//将数组的大小设置成2的n次方
while ((capcity & capcity - ) != )
capcity++;
_TS = new T[capcity];
_Capcity = capcity;
}
public void Write(T t)
{
_TS[_Index % _Capcity] = t;
_Index++;
} public IEnumerable<T> Read()
{
byte index = _Index;
for (int i = ; i < _TS.Count(); i++)
{
index--;
yield return _TS[index % _Capcity];
}
}
}

解释一下:

1.byte _Index=0;

_Index--; //=0xff

_Index++;//=0

利用byte的这个特点,写的时候++,读的时候--,不用考虑边界,是不是比较方便。

2.数组大小为什么要自动调整为2的n次方?

那是因为只有2的n次方的时候,(0xFF % _Capcity)==_Capcity-1,才能实现数组的遍历。

测试一下,调用的代码如下:

        static void Main(string[] args)
{
Buffer<int> buffer = new Buffer<int>();
var taskWrite = Task.Factory.StartNew(() =>
{ for (int i = ; i < ; i++)
{
buffer.Write(i);
Console.WriteLine($"Write:i={i}");
Task.Delay().Wait();
}
});
var taskRead = Task.Factory.StartNew(() =>
{
for (int i = ; i < ; i++)
{
Console.WriteLine("Read:" + string.Join(",", buffer.Read()));
Task.Delay().Wait();
}
});
Task.WaitAll(taskWrite, taskRead);
}
}

结果:

C# 固定大小的缓存

适用于:

1.小缓存,<=255

当然可以>255,只要把_Index的类型改为uint16,uint32或者uint64,那大小分别是0xFFFF,0xFFFFFFFF和0xFFFFFFFFFFFFFFFF,但是这么大有用吗?还叫缓存吗?

2.单线程读单线程写操作