Глава.4 .Основы.типов
в него статические поля данных. Байты для этих статических полей выделяются
в составе самих объектов-типов. Наконец, у каждого объекта-типа есть таблица
методов с входными точками всех методов, определенных в типе. Эта таблица ме-
тодов уже обсуждалась в главе 1. Так как в типе
Employee
определены три метода
(
GetYearsEmployed
,
GenProgressReport
и
Lookup
), в соответствующей таблице
методов есть три записи. В типе
Manager
определен один метод (переопределенный
метод
GenProgressReport
), который и представлен в таблице методов этого типа.
рис. 4.6.
.Среда.CLR.загружена.в.процесс,.куча.инициализирована,.готовится.вызов.
стека.потока,.в.который.загружен.метод.M3
рис. 4.7.
.При.вызове.M3.создаются.объекты.типа.Employee.и.Manager
137
Как.разные.компоненты.взаимодействуют.во.время.выполнения
После того как среда CLR создаст все необходимые для метода объекты-типы
и откомпилирует код метода
M3
, она приступает к выполнению машинного кода
M3
. При выполнении входного кода
M3
в стеке потока выделяется память для ло-
кальных переменных (рис. 4.8). В частности, CLR автоматически инициализирует
все локальные переменные значением
null
или
0
(нулем) — это делается в рамках
выполнения входного кода метода. Однако при попытке обращения к локальной
переменной, неявно инициализированной в вашем коде, компилятор С# выдаст
сообщение об ошибке
Use of unassigned local variable
(использование неини-
циализированной локальной переменной).
рис. 4.8.
.Выделение.памяти.в.стеке.потока.для.локальных.переменных.метода.M3
Далее
M3
выполняет код создания объекта
Manager
. При этом в управляемой
куче создается экземпляр типа
Manager
, то есть объект
Manager
(рис. 4.9). У объекта
Manager
— так же как и у всех остальных объектов — есть указатель на объект-тип
и индекс блока синхронизации. У этого объекта тоже есть байты, необходимые
для размещения всех экземплярных полей данных, определенные в типе
Manager
,
а также всех экземплярных полей, определенных во всех базовых классах типа
Manager
(в данном случае —
Employee
и
Object
). Всякий раз при создании ново-
го объекта в куче CLR автоматически инициализирует внутренний указатель на
объект-тип так, чтобы он указывал на соответствующий объект-тип (в данном
случае — на объект-тип
Manager
). Кроме того, CLR инициализирует индекс блока
синхронизации и присваивает всем экземплярным полям объекта значение
null
или
0
(нуль) перед вызовом конструктора типа — метода, который, скорее всего,
изменит значения некоторых экземплярных полей. Оператор
new
возвращает адрес
в памяти объекта
Manager
, который хранится в переменной
e
(в стеке потока).
Do'stlaringiz bilan baham: |