나는 ConditionalWeakTable
의 큰 팬이다. 정말 대단합니다. 기본적으로 하나의 참조를 다른 참조에 연결/연결/쌍으로 연결하는 동시에 스레드로부터 안전합니다.튜플 키 (또는 여러 참조로 구성된 키)와 함께 ConditionalWeakTable을 사용할 수 있습니까?
많은 질문/문제에 대한 답변입니다. 불행히도, 나는 계속해서 뛰어 들어가고 그것에 대한 좋은 대답을 찾을 수 없었던 문제가있는 것 같습니다.
ConditionalWeakTable
을 사용하는 방법 (아래의 테스트 방법으로 표시)이 있다고 가정 해 봅시다. 대신 키에 대한 단일 참조를 사용하는 대신 두 개의 항목을 결합하여 키로 사용해야합니다. 이것은 (단순히 데모 및 간결성에 대한 확장 Tuple
임) Key
객체로서 아래와 같다 다음 Debugger.Break
는 호출
[Fact]
public void TupleKey()
{
var first = new object();
var table = new ConditionalWeakTable<Key, object>();
var context = table.GetValue(new Key(first, new object()), key => new object());
// .. table has one entry here.
GC.Collect();
GC.WaitForPendingFinalizers();
Debugger.Break(); // Table is empty here.
}
class Key : Tuple<object, object>
{
public Key(object item1, object item2) : base(item1, item2) {}
}
상기 ConditionalWeakTable
은에 대한 활성 참조가에도 비어 시험 방법에서 Key
의 부분 중 하나. 이는 Key
에 대한 참조가 테스트에서 찾을 수 없기 때문에 의미가 있습니다.
그러나 Key
개체의 부분 중 하나에 대한 활성 참조가 있으므로 ConditionalWeakTable
의 항목을 활성 상태로 유지하고 해당 하위/내부 참조가 모두 주장 될 때까지 활성 상태로 유지하고 싶습니다.
(이 가능한 솔루션에 대한 생각, 그것은 어떻게 든 Dictionary<>
의 열쇠로 사용할 수있는 WeakHashSet
굉장이 있었다한다면,하지만 일부 검색에서, WeakHashSet
가에 있는지 표시되지 않습니다. NET)
이 내용이 내 딜레마를 설명하기를 바랍니다. 기본적으로 ConditionalWeakTable
(또는 이와 동등한)을 사용하여 관련된 값 (키/값 항목)을 저장하려고하지만 하나의 (약한) 참조를 항목의 키로 사용하는 대신 두 가지를 사용하고 싶습니다. (이상).
내가 달성하고자하는 것은 (사용자 정의 코드를 상당량 작성하지 않고) 가능한 것입니까?