2012-04-19 1 views
31

herehere에서 제안 된 것처럼 약한 참조를 사용하는 IDictionary을 검색 한 결과 최근에 ConditionalWeakTable<TKey,TValue> 클래스를 발견했습니다. 당신은 클래스를 찾을 수ConditionalWeakTable <TKey, TValue>를 컴파일러가 아닌 목적으로 사용해야합니까?

... System.Runtime.CompilerServices 네임 스페이스 :

클래스를 도입하고 어떤 상태 a definitive MSDN article 있습니다. CompilerServices는 범용 사전 유형이 아니기 때문에 컴파일러 작성자 만 사용할 수 있습니다. 나중에 다시

과 : 당신이 당신의 자신과 필요의 .NET 언어를 작성하는 경우

... 조건 약한 테이블은 범용 수집을 의도 ...하지만하지 않습니다 개체에 속성을 첨부 할 수있는 기능이 있음을 드러내려면 반드시 조건부 약한 ​​표를 조사해야합니다.

이 발 맞추어, 클래스의 MSDN 항목의 설명을 읽

동적으로 관리되는 개체에 개체 필드를 연결하는 컴파일러를 사용 가능하게합니다.

분명히 원래는 DLR을 돕기 위해 매우 구체적인 목적으로 만들어졌으며 System.Runtime.CompilerServices 네임 스페이스가이를 구현합니다. 그러나 CLR 내 에서조차도 그보다 훨씬 더 넓은 사용을 발견 한 것 같습니다. 예를 들어 ConditionalWeakTable의 참조를 ILSpy에서 검색하면 MEF 클래스 CatalogExportProvider 및 내부 WPF DataGridHelper 클래스에서 사용되는 것을 볼 수 있습니다.

궁금한 점은 컴파일러 작성 및 언어 도구 외에 ConditionalWeakTable을 사용해도되는지, 추가 오버 헤드가 발생하는지 또는 향후 .NET 버전에서 크게 변경 될 수 있는지에 대한 위험이 있는지 여부입니다. (또는 피해야하고 대신 this one과 같은 맞춤 구현을 사용해야합니다.)

도 더 ConditionalWeakTable이 키와 값 사이의 사이클의 문제를 해결하기 위해 ephemerons (System.Runtime.Compiler.Services. DependentHandle를 통해)의 숨겨진 CLR 구현을 사용합니다, 방법이 쉽게 달성 할 수없는 방법에 대한 here, herehere를 읽고 있습니다 맞춤 방식으로

답변

22

ConditionalWeakTable을 사용해도 이상한 부분이 보이지 않습니다. ephemerons가 필요한 경우에는 다른 선택의 여지가 거의 없습니다.

미래의 .NET 버전은 문제가되지 않을 것이라고 생각합니다. 컴파일러 만이 클래스를 사용하더라도 Microsoft는 기존 바이너리와의 호환성을 유지하면서 변경하지 못했습니다.

오버 헤드 - 정상적인 사전과 비교할 때 오버 헤드가 발생합니다. 대부분 DependentHandle을 갖는 것은 아마도 많은 사람들이 보통의 참조보다 더 비싸다는 것과 비슷할 것입니다. (GC는 그것들을 꺼내야 할지를보기 위해 추가 작업을해야합니다.) 그러나 당신이 많은 (수 백만) 항목을 가지고 있지 않으면 문제가되지 않습니다.

+0

감사합니다. 답변으로 표시하겠습니다. 당신이 옳다고 생각합니다. 약한 참조를 사용하는 Dictionary를 원한다. 그래서 ConditionalWeakTable은 약한 참조를 사용하는 다른 구현과 비교하여 오버 헤드를 추가해서는 안되며, ephemerons를 사용하는 이점이 추가되었습니다. – Riko

+0

ConditionalWeakTable을 사용할 수있게되어 매우 기뻤습니다. 설명서에서이 사실을 확인했습니다. "Object.GetHashCode를 재정의하여 키의 해시 코드를 명시 적으로 설정하여 등가 비교를 제어 할 수는 없습니다 .ConditionWeakTable 클래스는 Object.GetHashCode 메서드를 사용하여 해시 코드를 계산하므로 Object.GetHashCode 재정의를 호출하지 않습니다. " - 내 목적에 유용하지 않게 만든다. : – ctrlplusb

+6

@Sean : 'ConditionalWeakTable'이 코드에 대한 참조 ID 이외의 것을 사용할 수있는 방법이 없습니다. 왜냐하면 코드가 더 이상 키를 제공 할 수 없을 때이를 알 수 없기 때문에 (Halting Problem) 컬렉션의 항목과 일치해야합니다. – supercat

관련 문제