Я недавно наткнулся на классConditionalWeakTable
в своем поиске IDictionary
, который использует слабые ссылки, как это предлагается в ответах здесь и здесь .
Существует окончательная статья MSDN, в которой представлен этот класс и говорится, что:
Вы можете найти класс... в пространстве имен System.Runtime.CompilerServices. Он находится в CompilerServices, потому что это не универсальный -тип словаря :, мы предполагаем, что он будет использоваться только авторами компилятора.
и позже снова:
... условная слабая таблица не предназначена для использования в качестве коллекции общего назначения... Но если вы пишете собственный язык.NET и вам нужно предоставить возможность присоединения свойств к объектам вам обязательно следует заглянуть в Conditional Weak Table.
В соответствии с этим,описание класса в MSDN гласит::
Позволяет компиляторам динамически присоединять поля объектов к управляемым объектам.
Таким образом, очевидно, что изначально оно было создано для очень конкретной цели -, чтобы помочь DLR, и пространство имен System.Runtime.CompilerServices
воплощает это. Но, похоже, он нашел гораздо более широкое применение, чем -, даже в среде CLR. Если я ищу ссылки ConditionalWeakTable в ILSpy , например, я вижу, что это используется в классе MEFCatalogExportProvider
и во внутреннем классе WPF DataGridHelper
, среди прочего.
Мой вопрос заключается в том, можно ли использовать ConditionalWeakTable вне написания компилятора и языковых инструментов, и есть ли при этом какой-либо риск с точки зрения дополнительных накладных расходов или значительного изменения реализации в будущем. версии.NET. (Или следует избегать этого и использовать пользовательскую реализацию, такую как вместо ).
Также можно прочитать здесь , здесь и здесь о том, как ConditionalWeakTable использует скрытую реализацию CLR эфемероны(черезSystem.Runtime.Compiler.Services. DependentHandle
)для решения проблемы циклов между ключами и значениями и того, как это не может быть легко выполнено в пользовательском режиме.