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을 바꿨다면 어떤 Name이 맞을까요? –

+1

GetHashCode 메서드는 참조 동등성을 결정할 때 사용해서는 안됩니다. use object.ReferenceEquals .. 인스턴스가 동일한 값, 즉 값으로 간주되어야하는 경우 해시 코드는 동일해야합니다. 또한, 2 개의 해시 코드가 동일하다는 사실은 인스턴스가 동일하게 간주 될 수 있다는 것을 의미하지 않으며, 해시 코드가 동일하지 않고 인스턴스가 동일하지 않은 것으로 간주 될 수 있다는 것을 의미하지 않습니다. – MaLio

+0

MemoryCache가 얕은 복사본을 사용하는지 여부에 관계없이, GetHashCode()'는 두 개의 엔티티가 동일한 참조를 가지고 있음을 증명합니다. –

답변

1

당신이 MemoryCache이 얕은 복사본을 사용에 대해 어떻게 생각 하죠?

AFAIK는 전달한 객체 만 저장하며 복사하지 않습니다.

그래서 나중에 해당 개체를 변경하면 변경 사항은 캐시 된 개체에도 영향을줍니다 (동일한 개체이기 때문에). 분명히 이것은 문제를 일으킬 수 있습니다. 특히 당신이 깨닫지 못한다면 문제가 발생할 수 있습니다.

복사본과 캐시를 만드는 자체 캐시 클래스를 작성할 수 있습니다. 그러면 얕은 곳과 깊은 곳 사이에서 결정해야합니다.

+0

하나의 객체 (1MB를 차지함)를 생성했다고 가정 해 봅시다. 그런 다음 MemroyCache에 해당 객체를 추가하여 해당 객체에 대한 새 메모리 위치를 만들지 않고 해당 객체에 대한 기존 메모리 참조를 사용합니다. –

+0

예, 그렇습니다. – buffjape