C# 固定大小的缓存

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

    public class Buffer<T>
    {
        private T[] _TS;
        private byte _Index = 0;
        private int _Capcity;
        public Buffer(int capcity)
        {
            //将数组的大小设置成2的n次方
            while ((capcity & capcity - 1) != 0)
                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 = 0; 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>(10);
            var taskWrite = Task.Factory.StartNew(() =>
            {

                for (int i = 0; i < 20; i++)
                {
                    buffer.Write(i);
                    Console.WriteLine($"Write:i={i}");
                    Task.Delay(300).Wait();
                }
            });
            var taskRead = Task.Factory.StartNew(() =>
            {
                for (int i = 0; i < 7; i++)
                {
                    Console.WriteLine("Read:" + string.Join(",", buffer.Read()));
                    Task.Delay(1000).Wait();
                }
            });
            Task.WaitAll(taskWrite, taskRead);
        }
    }

结果:

适用于:

1.小缓存,<=255

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

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

原文地址:https://www.cnblogs.com/catzhou/p/9011527.html