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