13

MemoryCache の一般的な代替/実装はありますか?

私は、MemoryCache が内部で Hashtable を使用していることを知っているので、Hashtable の汎用バージョンである Dictionary<,> を使用するように移行するだけで済みます。

これにより、型の安全性が提供され、ボックス化/ボックス化解除がないため、パフォーマンスが向上します。

編集:私が興味を持っているもう1つのことは、異なるキータイプを持つことです。デフォルトは System.String です。

4

2 に答える 2

16

MemoryCacheの一般的な代替/実装はありますか?

基本クラスライブラリにはありません。自分でロールする必要がありますが、私は個人的に、必要なMemoryCacheAPIを提供するラッパーを作成するだけです。

これにより、タイプの安全性が提供され、ボクシング/アンボクシングがないため、パフォーマンス上のメリットが得られます。

型安全性は、ラッパークラスでかなり簡単に処理できます。ボックス化/アンボックス化は、値型(クラスではない)を格納している場合にのみ問題になります。それでも、これが真のパフォーマンスになるのに十分な頻度でキャッシュからプッシュおよびプルする可能性は低いため、最小限に抑えられます。問題。

型の安全性と使いやすさについては、実際に独自のメソッドを作成して、MemoryCacheアイテムの呼び出しをジェネリックメソッドでラップしました。これにより、APIの観点から少し優れた使用法が可能になります。これは非常に簡単です。通常、次のような方法が必要です。

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

同様に、同じ方法で値を設定するメソッドを作成できます。

編集:私が興味を持っているもう1つのことは、別のキータイプを使用することです。デフォルトはSystem.Stringです。

これはで直接サポートされていないMemoryCacheため、独自のキー生成を行うにはかなりの作業が必要になります。1つのオプションは、タイプセーフラッパーをFunc<T, string>作成することです。これにより、値に基づいて文字列キーを生成することもできます。これにより、任意のタイプのキャッシュエントリを生成できますT。ただし、もちろん、比較の一部として必要な文字列にすべてのデータを含めるように注意する必要があります。

于 2012-06-13T15:53:14.607 に答える