Можно ли использовать ConditionalWeakTable с ключом Tuple (или ключом, состоящим из нескольких ссылок)?C#

Место общения программистов C#
Ответить
Anonymous
 Можно ли использовать ConditionalWeakTable с ключом Tuple (или ключом, состоящим из нескольких ссылок)?

Сообщение Anonymous »

Я большой поклонник ConditionalWeakTable. Это действительно здорово. По сути, он позволяет вам связать/присоединить/сопоставить одну ссылку с другой ссылкой, сохраняя при этом потокобезопасность.
Для меня это отвечает на множество вопросов/проблем. К сожалению, похоже, у меня возникла проблема, с которой я продолжаю сталкиваться, и не могу найти на нее хороший ответ.
Предположим, у меня есть метод (обозначенный ниже как тестовый метод), в котором я использую 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 ) {}
}
При вызове Debugger.Break ConditionalWeakTable пуст, даже если в методе тестирования имеется активная ссылка на одну из частей Key. Это имеет смысл, поскольку ссылка на Key нигде не найдена в тесте.
Однако, поскольку существует одна активная ссылка на одну из частей объекта Key, я бы хотел, чтобы запись в ConditionalWeakTable также оставалась активной и оставалась активной до тех пор, пока не будут востребованы все ее дочерние/внутренние ссылки.
(Если подумать об этом и возможных решениях, было бы замечательно, если существовал WeakHashSet, который каким-то образом можно было использовать в качестве ключа к словарю, но в результате некоторого поиска выяснилось, что WeakHashSet не существует в .NET.)
Надеюсь, это обрисовывает мою дилемму. По сути, я хочу использовать ConditionalWeakTable (или какой-либо эквивалент) для хранения связанного значения (в виде записи ключа/значения), но вместо использования одной (слабой) ссылки в качестве ключа для записи я хотел бы использовать две (или более).
Возможно ли то, чего я хочу достичь (без необходимости писать значительный объем пользовательского кода)?

Подробнее здесь: https://stackoverflow.com/questions/378 ... -comprised
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»