System.Runtime.Caching.MemoryCache的通用实现

cae*_*say 12 c# generics optimization caching

MemoryCache有任何通用的替代/实现吗?

我知道MemoryCache在底层使用Hashtable,所以它只需要转换为使用Dictionary <,>,这是Hashtable的通用版本.

这将提供类型安全性并提供性能益处,因为没有装箱/拆箱.

编辑:我感兴趣的另一件事是拥有不同的密钥类型.默认值为System.String.

Ree*_*sey 15

MemoryCache有任何通用的替代/实现吗?

不在基类库中.你必须自己动手,虽然我个人只会做一个MemoryCache提供你想要的API 的包装器.

这将提供类型安全性并提供性能益处,因为没有装箱/拆箱

类型安全性可以在包装类中相当容易地处理.如果您存储值类型(而不是类),装箱/拆箱只会是一个问题,即使这样,也可能是最小的,因为您不太可能经常从缓存中推送和拉出以使其成为真正的性能问题.

至于类型安全性和可用性,我实际上已经编写了自己的方法来将MemoryCache项目的调用包装在一个通用方法中,从API的角度来看,它允许更好的使用.这很简单 - 通常只需要一个方法:

public T GetItem<T>(string key) where T : class
{
    return memoryCache[key] as T;
}
Run Code Online (Sandbox Code Playgroud)

同样,您可以创建一个方法来以相同的方式设置值.

编辑:我感兴趣的另一件事是拥有不同的密钥类型.默认值为System.String.

这不是直接支持的MemoryCache,因此需要相当多的工作才能生成自己的密钥.一种选择是创建一个类型安全的包装器,它还提供了Func<T, string>一个根据你的值生成一个字符串键 - 这将允许你为任何类型生成一个缓存条目T.当然,您必须小心将所有数据都包含在比较中所需的字符串中.

  • 我认为装箱/拆箱是一个有效的问题 - 如果您确实在缓存值类型。使用缓存的主要原因之一是因为您正在计算高频值。因此,缓存被大量命中将是一种常见情况。也许受到足够的打击而使拳击变得昂贵是一种不寻常的情况,但这取决于您的应用程序对 GC 压力的敏感程度 (2认同)