13

MemoryCache 是否有任何通用的替代方案/实现?

我知道 MemoryCache 在底层使用 Hashtable,因此只需转换为使用 Dictionary<,>,它是 Hashtable 的通用版本。

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

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

4

2 回答 2

16

MemoryCache 是否有任何通用的替代方案/实现?

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

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

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

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

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

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

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

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

于 2012-06-13T15:53:14.607 回答
1

我写了我的,FWIW:

https://github.com/ysharplanguage/GenericMemoryCache#readme(链接失效)

这里有一个原始代码的分支:

https://github.com/caesay/GenericMemoryCache

于 2015-08-25T18:44:55.027 回答