2017-01-23 15 views
0

Мне просто интересно, почему MemeoyCache использует мелкую копию для хранения данных кеша? любое предложение? Если memoryCache использует только ссылку на данные, какой тип данных хранится в CacheMemory.Почему MemoryCache использует неглубокую копию?

public static void TestmemoryCacheCloning() 
     { 
      var memoryCache = new MemoryCache("Test"); 
      var employee = new Employee 
      { 
       EmployeeId = 1, 
       Name = "A", 
       Aaddress = new Aaddress 
       { 
        City = "Delhi", 
        State = "Delhi", 
        Country = "India" 
       } 
      }; 

      memoryCache.Add("Test", employee, DateTimeOffset.Now.AddDays(1)); 
      Console.WriteLine(employee.GetHashCode()); 
      var output = memoryCache.Get("Test"); 
      Console.WriteLine(output.GetHashCode()); 

     } 

Выход:

49496962 
49496962 
+2

Какая польза от глубокой копии? Это приведет только к избыточности и, вероятно, к ошибкам. Что делать, если вы изменили имя employee.Name после кэширования, какое имя будет правильным? –

+1

Метод GetHashCode не должен использоваться для определения ссылочного равенства .. использовать object.ReferenceEquals .. hashcode должен быть одинаковым, если экземпляры должны считаться равными, то есть по значению. Кроме того, факт, что 2 хэш-кода равны, не означает, что экземпляры можно считать одинаковыми, только если хэш-коды не равны, то экземпляры можно считать не равными – MaLio

+0

Независимо от того, использует ли MemoryCache мелкие копии, используя ' GetHashCode() ', чтобы доказать, что два объекта имеют одну и ту же ссылку, недействительны. –

ответ

1

Что заставляет вас думать, MemoryCache использует неполную копию?

AFAIK Он просто хранит объект, в который вы проходите, и не выполняет никаких копий.

Итак, если вы вносите изменения в этот объект, эти изменения также влияют на кешированный объект (потому что это тот же объект). Очевидно, это может вызвать проблемы, особенно если вы не знаете, что это происходит.

Вы можете написать свой собственный класс кеша, который делает копию и кэширует это - тогда вам нужно будет решить неглубокие и глубокие.

+0

Предположим, что я создал один объект (который занял 1 мб). то я добавлю этот объект в MemroyCache, чтобы он не создал новую ячейку памяти для этого объекта. Он будет использовать существующую ссылку на память для этого объекта. –

+0

Да, вот что он делает. – buffjape