Недавно я наткнулся на класс ConditionalWeakTable<TKey,TValue>
в своем поиске IDictionary
который использует слабые ссылки, как предлагается в ответах здесь и здесь.
Существует исчерпывающая статья в MSDN, в которой представлен класс и в которой говорится:
Вы можете найти класс ... в пространстве имен System.Runtime.CompilerServices. Он находится в CompilerServices, потому что это не универсальный тип словаря: мы предполагаем, что он будет использоваться только разработчиками компилятора.
и позже снова:
... условная слабая таблица не предназначена для использования в качестве коллекции общего назначения ... Но если вы пишете собственный язык .NET и вам нужно предоставить возможность прикреплять свойства к объектам, вам обязательно нужно изучить Условные Слабый стол.
В соответствии с этим описание класса в MSDN гласит:
Позволяет компиляторам динамически присоединять поля объекта к управляемым объектам.
Очевидно, что изначально он был создан для очень конкретной цели - помочь DLR, и пространство имен System.Runtime.CompilerServices
воплощает это. Но, похоже, он нашел гораздо более широкое применение - даже в среде CLR. Если я ищу ссылки на ConditionalWeakTable в ILSpy, например, я вижу, что он используется в классе MEF _ 4_ и, среди прочего, во внутреннем классе WPF DataGridHelper
.
У меня вопрос, можно ли использовать ConditionalWeakTable вне компилятора и языковых инструментов, и есть ли при этом какой-либо риск с точки зрения дополнительных накладных расходов или значительного изменения реализации в будущих версиях .NET. (Или этого следует избегать и использовать индивидуальную реализацию, такую как этот вместо этого).
Дополнительную информацию можно найти здесь, здесь и здесь о том, как ConditionalWeakTable использует скрытую реализацию CLR ephemerons (через System.Runtime.Compiler.Services. DependentHandle
), чтобы решить проблему циклов между ключами и значениями, а также то, как это не может быть легко выполнено индивидуальным способом.