Подтвердить что ты не робот

Должен ли ConditionalWeakTable <TKey, TValue> использоваться для целей, не связанных с компилятором?

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

4b9b3361

Ответ 1

Я не вижу ничего плохого в использовании ConditionalWeakTable. Если вам нужны эфемероны, у вас практически нет другого выбора.

Я не думаю, что будущие версии .NET будут проблемой - даже если только компиляторы будут использовать этот класс, Microsoft все равно не сможет изменить его, не нарушая совместимость с существующими двоичными файлами.

Что касается накладных расходов, то, безусловно, будет накладные расходы по сравнению с обычным Словарем. Вероятно, много DependentHandle будет дорогостоящим, так как количество WeakReference более дорогостоящее, чем обычные ссылки (GC должен выполнить дополнительную работу, чтобы отсканировать их, чтобы увидеть, нужно ли их отключать). Но это не проблема, если у вас нет много (нескольких миллионов) записей.