2012-08-29 5 views
2

사용자 정의 유형이 MyClass이고 요청시 MyClass 유형의 객체를 생성하는 팩토리 클래스 Factory이 있습니다.약한 참조 및 약한 참조의 사전

개체는을 만드는 데 많은 비용이 소요되고 동일한 개체를 여러 번 만들도록 요청할 수 있기 때문에 사전에 개체를 저장합니다. 동일한 태그를 가진 각 객체는 한 번만 만들어야합니다.

class MyObject 
{ 
    // .. not important 
} 

class Factory 
{ 
    private Dictionary<int, MyObject> m_objects = new Dictionary<int, MyObject>(); 

    public MyObject CreateObject(int tag, params object[] parameters) 
    { 
     MyObject obj; 
     if (!m_objects.TryGetValue(tag, out obj)) 
     { 
      obj = new MyObject(); 
      // .. some initialization 
      m_objects.Add(tag, obj); 
     } 

     return obj; 
    } 
} 

이 될 수와 시간의 알 수없는 금액에 대한Factory 외부 어딘가에 저장되지 수 있습니다 개체. 객체 은 생성 후으로 변경 될 수 있습니다. Factory이 개체에 대한 참조를 저장하고 그 개체가 다른 곳에 저장되지 않는 경우가 있습니다.

이제 가비지 컬렉터가 그 일을하도록하고 싶습니다. Factory 외부에 저장되지 않고이 변경되지 않도록하고 싶습니다.

내 첫 번째 생각은 Factory 안에있는 사전의 값에 약한 참조를 사용하는 것이지만이 방법이 "변경된 및 참조되지 않은"대소 문자를 처리하지 않는 것처럼 보입니다.

그들은 어떻게 그래서 나는 사전에 생성 된 개체를 저장해야합니다

  • 쓰레기는 참조하지 않을 경우
  • 쓰레기는 수집되지 않습니다 수집하지만 변경 될 수 있습니까? CodesInChaos '답변을 확장
+4

변경된 모든 개체를 넣을 추가 사전을 만드는 것은 어떻습니까? – CodesInChaos

+0

@CodesInChaos 감사합니다. 흥미 롭습니다. 그러나 사전은 매우 커서 (수만 쌍이 될 수 있습니다.) 제가 그렇게 할 수 있다면 사전을 복제하지 않는 것이 좋습니다. – Bobrovsky

+2

그게 몇 백 킬로바이트. 데스크톱 응용 프로그램이라면 괜찮을 것입니다. – CodesInChaos

답변

4

, 난 당신이 원래 Dictionary에 약한 참조를 사용하여 올바른 궤도에 있다고 생각하고 나는 그것이 두 번째 데이터 구조를 사용하는 말이 생각 - 아마 HashSet 여기 잘 작동 - 그 변경된 객체에 대한 참조 만 보유합니다.

참조을 개체에 저장하는 것이 저렴하다는 점을 기억하십시오. 내가 걱정이되기 전에 당신이 수백만 또는 수십억의 참조를해야한다고 생각합니다.