Где именно does.Net хранить значения статических полей универсальных типов?
Следующий код позволяет мне хранить значение для каждого типа T:
public static class MyDict<T> {
public static T Value;
}
Я могу хранить столько значений, сколько существует типов, и компилятор не знает заранее, какие типы я собираюсь использовать. Как и где хранятся эти статические значения полей?
Обновление : Очевидно, он хранится в памяти, но я хочу знать об этой памяти. Это куча? Это какая-то особая память CLR? Как это называется? Что еще хранится таким образом?
Обновление 2 :
дрожание генерирует единственную реализацию MyDict<__Canon> для всех аргументов ссылочного типа MyDict<T>. Тем не менее, значения хранятся отдельно. Я предполагаю, что все еще существует некоторая структура аргументов для каждого типа аргумента, и хотя thw vtable связан с JITted MyDict<__Canon>, поля разделены. Разве я не прав?
2 ответа:
Как и где хранятся эти статические значения полей?
Они хранятся в памяти в месте, выбранном CLR.
Очевидно, что он хранится в памяти, но я хочу знать об этой памяти.Я исхожу из любопытства. Если вы принимаете программное решение, основанное на ответе на этот вопрос, то вы делаете что-то неправильно.
Это куча?
Ну, это не стек или регистры, это уж точно.
Это какая-то особая память CLR?
Ага.
Как это называется?
Высокочастотная куча.
Что еще хранится таким образом?
Vtables. Структуры карт интерфейса. Описание метода. И все остальное, что, по мнению CLR, будет доступно часто, по собственному усмотрению CLR. Здесь мы глубоко погружены в детали реализации.
Дрожание генерирует единственную реализацию
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)?Нет. Постройте его сами, если вам это нужно.
MyDict<T>не является полностью определенным типом. Каждый полностью определенный типMyDict<T>будет иметь свой собственный уникальный экземпляр значения (напр.MyDict<string>,MyDict<object>, иMyDict<int>может иметь уникальное значениеValue).Также, это не является особенным, потому что тип
ValueявляетсяT, даже если типValueбылDateTime, Каждый полностью определенный тип все равно будет иметь свой собственный экземпляр статического значения.