欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C# 固定大小的缓存

程序员文章站 2022-04-08 14:58:29
有时候需要把最新的N条记录暂时存起来供需要的时候调用,C#有没有指针,怎么办呢咱利用数组和byte字节整一个类: 解释一下: 1.byte _Index=0; _Index--; //=0xff _Index++;//=0 利用byte的这个特点,写的时候++,读的时候--,不用考虑边界,是不是比较 ......

有时候需要把最新的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);
        }
    }

结果:

C# 固定大小的缓存

 

适用于:

1.小缓存,<=255

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

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