C#教程

关注公众号 jb51net

关闭
首页 > 软件编程 > C#教程 > C# 内存缓存和对象池化

C#中内存缓存和对象池化的实现

作者:ghost143

本文主要介绍了C#中内存缓存和对象池化的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

内存缓存

什么是内存缓存?

实际应用场景 

优缺点

示例 

System.Runtime.Caching命名空间提供了内存缓存的功能,MemoryCache类是常用的缓存实现。

using System;
using System.Runtime.Caching;

public class CachingExample
{
    // 创建一个默认的内存缓存实例
    private static MemoryCache cache = MemoryCache.Default;

    public static void Main()
    {
        string key = "sampleData";
        // 获取数据(如果缓存中存在则直接获取,否则从源获取并缓存)
        string value = GetData(key);
        Console.WriteLine($"Data: {value}");
        
        // 再次调用以演示缓存命中
        value = GetData(key);
        Console.WriteLine($"Data: {value}");
    }

    public static string GetData(string key)
    {
        // 检查缓存中是否存在数据
        if (cache.Contains(key))
        {
            Console.WriteLine("缓存命中。");
            return cache[key] as string; // 从缓存中获取数据
        }

        // 模拟数据获取并缓存
        Console.WriteLine("缓存未命中。正在检索数据...");
        string data = "这是一些示例数据。";

        // 设置缓存策略,10分钟后过期
        CacheItemPolicy policy = new CacheItemPolicy
        {
            AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(10)
        };

        // 将数据添加到缓存中
        cache.Add(key, data, policy);
        return data;
    }
}

对象池化 

什么是对象池化?

实际应用场景

优缺点

示例

using System;
using System.Collections.Generic;

// 泛型对象池类,用于对象的重用
public class ObjectPool<T> where T : new()
{
    // 使用栈来存储对象
    private readonly Stack<T> _objects = new Stack<T>();
    private readonly int _maxSize; // 对象池的最大容量

    public ObjectPool(int maxSize)
    {
        _maxSize = maxSize;
    }

    // 获取对象的方法
    public T GetObject()
    {
        if (_objects.Count > 0)
        {
            Console.WriteLine("从对象池中重用对象。");
            return _objects.Pop(); // 从对象池中获取对象
        }

        Console.WriteLine("创建新对象。");
        return new T(); // 创建新对象
    }

    // 返回对象到池中
    public void ReturnObject(T obj)
    {
        if (_objects.Count < _maxSize)
        {
            _objects.Push(obj); // 将对象放回池中
            Console.WriteLine("对象已返回到池中。");
        }
    }
}

// 示例对象类
public class ExampleObject
{
    public int Value { get; set; }
}

public class Program
{
    public static void Main()
    {
        // 创建一个对象池,最大容量为5
        ObjectPool<ExampleObject> pool = new ObjectPool<ExampleObject>(5);

        // 获取一个对象并设置其值
        ExampleObject obj1 = pool.GetObject();
        obj1.Value = 42;

        // 将对象返回到池中
        pool.ReturnObject(obj1);

        // 再次获取对象,应该重用之前的对象
        ExampleObject obj2 = pool.GetObject();
        Console.WriteLine($"对象值: {obj2.Value}"); // 输出:42
    }
}

总结

在选择这两种技术时,需要根据应用的具体需求、对象的生命周期和访问模式来做出最佳决策。有效的使用可以显著提升应用的性能和响应性。

到此这篇关于C#中内存缓存和对象池化的实现的文章就介绍到这了,更多相关C# 内存缓存和对象池化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文