2017-06-26 7 views
-3

C#MemoryCacheの動作により、私のユニットテストのいくつかが失敗しています。新しいMemoryCacheオブジェクトが作成されると、別のメモリキャッシュに追加されたオブジェクトにもアクセスできます。誰がなぜこれが当てはまるのか知っていますか?なぜ新しいC#MemoryCacheは別のキャッシュのオブジェクトにアクセスできますか?

static void Main(string[] args) 
    { 
     ObjectCache cache1 = MemoryCache.Default; 

     object myObject = new object(); 

     CacheItemPolicy cacheItemPolicy = new CacheItemPolicy(); 
     cacheItemPolicy.SlidingExpiration = new TimeSpan(4, 0, 0); 
     cache1.Add("My Object", myObject, cacheItemPolicy); 

     ObjectCache cache2 = MemoryCache.Default; 

     object cachedObject = cache2.Get("My Object"); 
    } 

cache2から返されたキャッシュオブジェクトは、cache1に追加されたオブジェクトです。

+0

'cache1'と' cache2'は両方とも 'MemoryCache.Default'です。あなたは新しいものを作りませんでした。 –

+2

示されたコードは、「新しいMemoryCacheオブジェクトが作成された」ことをまったく示さない。間違ったコードを投稿した可能性があります - 投稿を編集して、正しいコードを投稿してください。 (もしあなたが 'cache2 = MemoryCache.Default'が新しいインスタンスを作成すると思われるなら、C#でどのような割り当てが行われているかを読むこともできます) –

答えて

2

投稿したコードにMemoryCacheを作成したことはありません。しかし、あなたがしたことは、cache1cache2の名前でMemoryCache.Defaultを参照する変数を宣言しています。これを実証するには、いつでもReferenceEqualsメソッドを使用できます。ご覧のように、次のコードは両方とも "MemoryCache.Default"を示す "True"を出力します。

static void Main(string[] args) 
{ 
    //Your code, from the original post 
    ObjectCache cache1 = MemoryCache.Default; 
    object myObject = new object(); 
    CacheItemPolicy cacheItemPolicy = new CacheItemPolicy(); 
    cacheItemPolicy.SlidingExpiration = new TimeSpan(4, 0, 0); 
    cache1.Add("My Object", myObject, cacheItemPolicy); 
    ObjectCache cache2 = MemoryCache.Default; 
    object cachedObject = cache2.Get("My Object"); 

    //Test the reference, output the result 
    Console.WriteLine(ReferenceEquals(cache1, cache2)); //Outputs True 
} 
関連する問題