Вы видите, что три числа в области памяти 002300 не изменились. Почему же тогда первый из двух операторов Debug.WriteLine(B(2)) печатает пятерку, а не ноль? Вот почему. Механизм обращения к памяти здесь тот же, что и описанный парой абзацев ранее механизм обращения к памяти при выполнении оператора A(2) = 5. Компьютер, зная, что массив является ссылочным типом, рассматривает значение 002040 в ячейке для переменной B, как адрес, и отправляется по указанному адресу, где находит три ячейки. Индекс 2 указывает ему, что для печати нужно выбрать значение из последней ячейки, а там находится пятерка.
А кому же теперь нужна область 002300? В том-то и дело, что никому! Ссылок на нее теперь не существует и воспользоваться ей уже нельзя, даже если вы и захотите. Она превратилась в мусор (garbage). Уборкой мусора занимается VB и делает это без вашего ведома и участия.
Я думаю, что теперь мне не нужно объяснять, почему второй из двух операторов Debug.WriteLine(B(2)) напечатает сотню.
3. Классы. Аналогично рассматривается третий фрагмент. При создании объекта из класса, как и при создании массива, в памяти под объект отводится одна ячейка и еще дополнительно область памяти для хранения элементов объекта (в нашем случае две ячейки для полей, которые заполняются нулями). В этой одной ячейке находится ссылка на область памяти. Вот что будет в памяти при окончании работы третьего фрагмента:
Адреса |
Значения |
Адреса |
Значения |
|||
A |
000101 |
002040 |
![]() ![]() |
Поле |
002040 |
100 |
Поле1 |
002041 |
0 |
||||
B |
000102 |
002040 |
Поле |
002300 |
0 |
|
Поле1 |
002301 |
0 |
Задание 21.
Что напечатает фрагмент:
Dim A, B, C As Класс
A = New Класс
A.Поле = 100
B = A
C = New Класс
C.Поле = 50
A = C
Debug.WriteLine(A.Поле)
Debug.WriteLine(B.Поле)