#c# #.net #vb.net #memory #reference
#c# #.net #vb.net #память #ссылка
Вопрос:
Поскольку ссылочные значения хранятся в куче в виде данных; где хранится информация о типе любого ссылочного значения?
Если существует пара экземпляров класса Artist; когда они хранятся в куче, как .Net помечает эти блоки памяти как тип исполнителя?
Спасибо!
Ответ №1:
void M()
{
Artist a = new Artist();
}
При вызове метода расширяется новый фрейм стека, в CLR есть некоторый код подготовки перед выполнением первого оператора метода, например, prolegomenon. В течение этого периода CLR загружает все типы, используемые в методе. В этом примере тип Artist
будет загружен в кучу. Но также возможно, что тип уже существует, потому что тип используется перед M()
вызовом. Затем мы переходим к первому выражению, new
инструкции, которая вызывает конструктор класса. Если вы взглянете на сгенерированный им CIL, вы увидите что-то вроде newobj
blabla. Здесь блок памяти в куче выделяется для хранения экземпляра. Размер блока зависит от деталей класса, потому что блок должен содержать все данные экземпляра. Обычно блок состоит из:
Type pointer Sync root Instance data
Указатель типа указывает на его тип в куче (загруженный в prolegomenon). Корень синхронизации — это запись для блокировки и синхронизации. Данные экземпляра хранят данные членов экземпляра.
Комментарии:
1. Для ссылочного типа ответ ясен. Но где хранится объект типа типа типа типа, имеет ли объект типа значения: указатель типа корень синхронизации Дополнительные поля данных экземпляра?
Ответ №2:
Среда CLR хранит пару битов информации вместе с данными в вашем экземпляре объекта. Одним из них является указатель на тип объекта.
Ответ №3:
Непосредственно перед первым использованием класса среда выполнения dotnet создает объект в куче, в котором хранится вся информация об используемом классе. Сюда входят статические поля, таблица методов, указывающая на доступные классу методы, указатель на объект типа (подробнее об этом через секунду) и блок синхронизации (используется для блокировки объекта).
Все объекты имеют указатель типа object, который указывает на объект, в котором хранится информация о классе.
Итак, например, если у вас есть объект Person, у него будет указатель типа object, который указывает на объект в куче, в котором хранится вся информация о person. Этот объект типа person также будет иметь указатель типа object, который указывает на объект System.Введите, поскольку это тип System.Тип (это объект, который хранит информацию о типе объекта).
Конечно, система.Тип, будучи объектом в куче, также имеет указатель type object, который указывает на информацию о том, к какому типу он относится. Как вы, наверное, догадались — он указывает на себя как на систему.Объект типа — это система.Тип объекта.
Когда вы вызываете GetType() для объекта, он просто возвращает адрес, сохраненный в указателе объекта определенного типа objects.