Где .Net хранит значения статических полей общих типов?

Следующий код позволяет мне сохранить значение для каждого типа T:

public static class MyDict<T> {
    public static T Value;
}

Я могу хранить столько значений, сколько есть типов, и компилятор не знает раньше, какие типы я буду использовать. Как и где хранятся эти значения статического поля?

Обновление: Очевидно, он хранится в памяти, но я хочу знать об этой памяти. Это куча? Это какая-то специальная память CLR? Как это называется? Что еще хранится таким образом?

Обновление 2: JITter генерирует единую реализацию MyDict<__Canon> для всех аргументов ссылочного типа MyDict<T>. Тем не менее, значения хранятся отдельно. Я предполагаю, что для каждого аргумента типа есть еще какая-либо структура типа-типа. В то время как vtable связана с JITted MyDict<__Canon>, поля являются отдельными. Я прав?

Ответ 1

Как и где хранятся эти значения статического поля?

Они сохраняются в памяти в месте выбора CLR.

Очевидно, он хранится в памяти, но я хочу знать об этой памяти.

Я предполагаю из любопытства. Если вы принимаете решение о программировании на основе ответа на этот вопрос, вы делаете что-то неправильно.

Это куча?

Ну это не складывается или регистрируется, что точно.

Это какая-то специальная память CLR?

Да.

Как это называется?

Высокочастотная куча.

Что еще хранится таким образом?

виртуальные таблицы. Структуры структуры интерфейса. Описание методов. И что-нибудь еще, что, по мнению CLR, будет часто посещаться по собственному усмотрению CLR. Мы подробно расскажем о деталях реализации.

JITter создает единую реализацию MyDict<__Canon> для всех аргументов ссылочного типа MyDict<T>.

Правильно, хотя это детализация реализации.

Тем не менее значения сохраняются отдельно.

Под "значениями" вы подразумеваете "значения статических полей каждого построенного типа". Да.

Я предполагаю, что для каждого аргумента типа

существует еще какая-то структура типа-типа-аргумента,

Да, данные должны куда-то идти!

vtable связана с JITted MyDict<__Canon>, поля являются отдельными.

Я не понимаю, что означает это предложение, поэтому я не могу подтвердить или опровергнуть его правильность.

Я также задаюсь вопросом, есть ли способ иметь хранилища для каждого объекта. То есть не общий тип + T, но объект + T

Чтобы уточнить, ваш вопрос: существует механизм хранения, который связывает общий тип C<T> и заданную конструкцию C<Foo> с заданным статическим полем C<Foo>. Мы можем думать об этом как о поиске, где "ключ" - это кортеж (C<T>, Foo, field), а значение - это значение поля. Есть ли аналогичный механизм хранения, где ключ (C<T>, some arbitrary object, field)?

Нет. Постройте его самостоятельно, если вам это нужно.

Ответ 2

MyDict<T> не является полностью определенным типом. Каждый полностью определенный тип MyDict<T> будет иметь свой собственный уникальный экземпляр значения (например, MyDict<string>, MyDict<object> и MyDict<int> может иметь уникальное значение Value).

Кроме того, это не является особым, потому что тип Value равен T, даже если тип Value был DateTime, у каждого полностью определенного типа все равно будет свой собственный экземпляр статического значения.