Жизненный цикл объекта. Уничтожение объектов.
Итак, при создании экземпляра класса оператором New вызывается соответствующий метод-конструктор New из определения класса (также может быть вызван общий конструктор, если он есть). Версия конструктора выбирается в соответствии с типом переданных параметров. Конструктор можно рассматривать как аналог события Class_Initiallze в VB6.
Не в каждом классе определяется открытый конструктор. Более того, в некоторых ситуациях все конструкторы класса объявляются закрытыми и экземпляры создаются только общими методами. Конструктор объявляется закрытым в одном из следующих случаев:
- Если он должен вызываться только из класса. Например, в классе может быть определен открытый конструктор, который вызывает закрытый конструктор при определенных обстоятельствах (например, в зависимости от типа переданных параметров).
- Если специфика класса не предусматривает создание его экземпляров. Например, класс, состоящий только из общих членов, должен содержать только закрытые конструкторы, поскольку его экземпляры не должны создаваться во внешних программах. В подобных ситуациях вы должны определить хотя бы один закрытый конструктор, в противном случае VB.NET автоматически сгенерирует открытый безаргументный конструктор.
- Если вызов закрытого конструктора через общий метод используется для контроля над созданием экземпляров. Например, если создание объекта требует больших затрат времени и ресурсов, необходимо позаботиться о том, чтобы экземпляры создавались только в случае крайней необходимости.
После того как объект будет создан оператором New, вы не сможете изменить его состояние повторным вызовом New. Пример:
Dim Tom As New EmployeeC'Tom ", 100000) Tom = New Employee("Tom ". 125000)
В этом фрагменте создаются два разных объекта Employee, причем после присваивания во второй строке первый объект Тоm теряется. Иногда это соответствует намерениям программиста, иногда – нет. Например, если идентификатор работника хранится в общей переменной EmployeeID, то вторая строка присвоит второму объекту Тот идентификатор на 1 больше первоначального. Так или иначе, следующий фрагмент заведомо невозможен:
Dim Tom As New Employee("Tom ", 100000) Dim Tom As New Employee("Tom ", 125000)
Компилятор выдает следующее сообщение об ошибке:
The local variable 'Tom' is defined multiple times in the same method.
Уничтожение объектов
В VB.NET объекты не умирают "естественной смертью"; в каком-то смысле они постепенно "уходят в небытие" со временем. Главное отличие от предыдущих версий VB заключается в том, что вы не можете явно освободить память, занимаемую объектом. Встроенный сборщик мусора когда-нибудь заметит, что эти блоки памяти не используются в программе, и автоматически освободит их. Автоматическая сборка мусора оказывает сильное влияние на программирование в VB.NET. В частности, сборку мусора следует рассматривать как полностью автоматизированный процесс, на который вы абсолютно не можете повлиять.
Хотя в программе можно провести принудительную сборку мусора вызовом метода System.GC.Collect(), считается, что это не соответствует хорошему стилю программирования .NET. Мы рекомендуем всегда полагаться на автоматическую сборку мусора.