C# 固定大小的缓存

catzhou 2018-05-08 原文

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.单线程读单线程写操作

 

发表于 2018-05-08 22:43 毛毛虫 阅读() 评论() 编辑 收藏

 

版权声明:本文为catzhou原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/catzhou/p/9011527.html

C# 固定大小的缓存的更多相关文章

  1. WPF 自定义ComboBox样式

    一、ComboBox基本样式 ComboBox有两种状态,可编辑和不可编辑状态。通过设置IsEditable属 […]...

  2. C#/AutoCAD 2018/ObjectArx/二次开发添加删除实体的工具函数(四)

    1、添加删除实体 C# ObjectARX二次开发添加删除实体是非常容易主要代码如下: 添加实体: objId […]...

  3. 浅析C#之委托、Action、Func

    一、委托 1.1 委托的定义 delegate(委托)是一种可用于封装命名方法或匿名方法的引用类型, 委托类似 […]...

  4. Mego(05) – Mego Tools使用教程

    前言 使用过EntityFramework6的朋友应该都知道EF中的PowerTools这个工具可以帮助初学者 […]...

  5. C#常见金额优选类型及其三种常用的取整方式

    这两天一直在做一个商城后台的对账方面的工作,忽然发现C#真的有很多值的学习的东西: 一、C#常用的三种取整方式 […]...

  6. 【UE4 C++ 基础知识】 Delegate 委托

    概念 定义 UE4中的delegate(委托)常用于解耦不同对象之间的关联:委托的触发者不与监听者有直接关联, […]...

  7. Entitas Learning Document

    Entitas Learning Document You can find Entitas project […]...

  8. C#规范整理·集合和Linq

    有用请点赞,无用请评论无用,如果有不理解请留言   开始! 前言   C#中的集合表现为数组和若干集合类。不管 […]...

随机推荐

  1. CORBA的服务类型

    4.1 详解CORBA事件服务实现 CORBA事件服务通过对事件(由对象产生并且传送给其他对象)封装而提供了基 […]...

  2. JAVA基础第四章-集合框架Collection篇

     业内经常说的一句话是不要重复造轮子,但是有时候,只有自己造一个轮子了,才会深刻明白什么样的轮子适合山路,什么 […]...

  3. 常用系统信息API

    1.窗口信息    MS为我们提供了打开特定桌面和枚举桌面窗口的函数。    hDesk=OpenDeskto […]...

  4. Flink+ClickHouse 玩转企业级实时大数据开发《慕课》

    Flink+ClickHouse 玩转企业级实时大数据开发 Flink发展史&特点&行业应用 […]...

  5. 一款好用的C# dll文件破译工具

    今天由于工作对工作流引擎的调用繁多,却只能在对象浏览器中查阅dll的内容,非常不爽,抱着好奇的心情上网搜索dl […]...

  6. Java企业微信开发_06_素材管理之上传本地临时素材文件至微信服务器

    一、本节要点 1.临时素材有效期 media_id是可复用的,同一个media_id可用于消息的多次发送(3天 […]...

  7. NodeJs的第一天

    首先是express   它是nodejs的一个服务器框架 是基于nodejs的  想要使用它必须要先下载ex […]...

  8. 使用百度地图api可视化聚类结果

    1.写在前面 上接YFCC 100M数据集分析笔记,在对聚类出的照片GEO集聚类后,为了方便检测聚类结果,我们 […]...

展开目录

目录导航