C# ListPool 缓存数据结构

Posted jwv5

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# ListPool 缓存数据结构相关的知识,希望对你有一定的参考价值。

可重复使用(缓存)结构

1.利用静态类&静态方法获取某个数据结构。

2.利用静态变量在所有类成员中公用的原理,达到使用时(分情况)获取,不使用时不释放而是缓存以便下次使用的目的。


适用环境

  1.该数据结构存储的数据为临时数据,短时间使用后会被释放。

  2.某一帧内多次重复使用同一数据结构。(例如for循环中,当然你用循环外临时变量也是ok的)

  3.某些特殊情况,比如多线程的频繁交互。

使用方式:

  1.通过静态方法获取数据结构

  2.用完还给静态方法(一定记住)


代码:

使用方式:
        private void Start() 
        
            List<PaintToolbarItem> list = ListPool<PaintToolbarItem>.Pop();
               
           // 使用

            ListPool<PaintToolbarItem>.Push(list);
                

 

技术图片
using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;

namespace Game

    public class CSObjectPool<T> where T : class, new()
    
        private Stack<T> m_ObjStack = new Stack<T>();
        private Action<T> m_OnPop;
        private Action<T> m_OnPush;
        
        
        public CSObjectPool(Action<T> onPop, Action<T> onPush)
        
            m_OnPop = onPop;
            m_OnPush = onPush;
        
        
        
        /// <summary>
        /// 取出
        /// </summary>
        public T Pop()
        
            T obj = null;
            if(m_ObjStack.Count == 0)
            
                obj = new T();
            
            else
            
                obj = m_ObjStack.Pop();
            
            
            if(obj != null && m_OnPop != null)
            
                m_OnPop(obj);
            
            return obj;
        
        
        /// <summary>
        /// 放回
        /// </summary>
        public void Push(T obj)
        
            if(obj == null)
                return;
            
            if(m_ObjStack.Count > 0 && ReferenceEquals(m_ObjStack.Peek(), obj))
            
                Debug.LogError(string.Format("CSObjectPool error. Trying to push object that is already in the pool, obj = 0", obj));
                return;
            
            
            if(m_OnPush != null)
            
                m_OnPush(obj);
            
            m_ObjStack.Push(obj);
        
    
View Code
技术图片
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

namespace Game

    public static class ListPool<T>
    
        private static CSObjectPool<List<T>> m_Pools = new CSObjectPool<List<T>>(null, x => x.Clear());

        /// <summary>
        /// 取出
        /// </summary>
        public static List<T> Pop()
        
            return m_Pools.Pop();
        
        /// <summary>
        /// 放回
        /// </summary>
        public static void Push(List<T> list)
        
            m_Pools.Push(list);
        
    


    public static class HashSetPool<T>
    
        private static CSObjectPool<HashSet<T>> m_Pools = new CSObjectPool<HashSet<T>>(null, x => x.Clear());

        /// <summary>
        /// 取出
        /// </summary>
        public static HashSet<T> Pop()
        
            return m_Pools.Pop();
        
        /// <summary>
        /// 放回
        /// </summary>
        public static void Push(HashSet<T> hashSet)
        
            m_Pools.Push(hashSet);
        
    

View Code

以上是关于C# ListPool 缓存数据结构的主要内容,如果未能解决你的问题,请参考以下文章

C#中设计一个 ListPool 的方案

LRU缓存替换策略及C#实现

C# 实现 key-value 结构自定义缓存 CustomCache

c#从串口读取数据怎样读一个就清空缓存

C#函数式编程之缓存技术

具有 TestCase() 属性的 C# 单元测试不清理数据库/缓存?