Следует ли использовать ConditionalWeakTable для целей, отличных от -компилятора?

Я недавно наткнулся на класс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)для решения проблемы циклов между ключами и значениями и того, как это не может быть легко выполнено в пользовательском режиме.

32
задан Community 23 May 2017 в 10:34
поделиться