Для меня это отвечает на множество вопросов/проблем. К сожалению, похоже, у меня возникла проблема, с которой я продолжаю сталкиваться, и не могу найти на нее хороший ответ.
Предположим, у меня есть метод (обозначенный ниже как тестовый метод), в котором я использую ConditionalWeakTable, но вместо использования одной ссылки для ключа мне нужно объединить два элемента и сделать его ключом. Это показано ниже в виде объекта Key (который представляет собой просто расширенный кортеж для демонстрационных целей и краткости):
Код: Выделить всё
[Fact]
public void TupleKey()
{
var first = new object();
var table = new ConditionalWeakTable();
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
{
public Key( object item1, object item2 ) : base( item1, item2 ) {}
}
Однако, поскольку существует одна активная ссылка на одну из частей объекта Key, я бы хотел, чтобы запись в ConditionalWeakTable также оставалась активной и оставалась активной до тех пор, пока не будут востребованы все ее дочерние/внутренние ссылки.
(Если подумать об этом и возможных решениях, было бы замечательно, если существовал WeakHashSet, который каким-то образом можно было использовать в качестве ключа к словарю, но в результате некоторого поиска выяснилось, что WeakHashSet не существует в .NET.)
Надеюсь, это обрисовывает мою дилемму. По сути, я хочу использовать ConditionalWeakTable (или какой-либо эквивалент) для хранения связанного значения (в виде записи ключа/значения), но вместо использования одной (слабой) ссылки в качестве ключа для записи я хотел бы использовать две (или более).
Возможно ли то, чего я хочу достичь (без необходимости писать значительный объем пользовательского кода)?
Подробнее здесь: https://stackoverflow.com/questions/378 ... -comprised
Мобильная версия