Иллюстрированный самоучитель по Visual Basic .NET
Итак, при создании экземпляра класса оператором 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. Мы рекомендуем всегда полагаться на автоматическую сборку мусора.
5.Объекты и их жизненный цикл. Создание и уничтожение объектов.
В объектно-ориентированном языке при связывании кода и данных создается объект. Код, данные или обе эти составляющие объекта могут быть закрытыми внутри него или открытыми. Закрытый код или закрытые данные известны лишь остальной части этого объекта и доступны только ей. Это означает, что к закрытому коду или данным не может получить доступ никакая другая часть программы, существующая вне этого объекта. Если код или данные являются открытыми, к ним (несмотря на то, что они определены внутри объекта) могут получить доступ другие части программы.
Объекты — это экземпляры класса. Класс — это логическая абстракция. О ее реализации нет смысла говорить до тех пор, пока не создан объект класса, и в памяти не появилось физическое его представление. Данные содержатся в переменных экземпляров, а код — в методах.
Рассмотрим создание объекта на примере класса Person.
Оператор new вызывает конструктор класса Person. Для pers создается ссылка со значением null. Затем в динамической памяти создается объект. Ссылка привязывается к созданному объекту. Если объект не используется, на него нет ни одной ссылки, то сборщик мусора его удаляет (освобождает память, занимаемую данным объектом). Для корректного удаления сборщик мусора вызывает деструктор, который проверяет, например, все ли ресурсы, используемые объектом, освобождены.
6.Инкапсуляция. Определение. Функциональное назначение. Реализация. Примеры применения
Инкапсуляция — это механизм программирования, который связывает код (действия) и данные, которыми он манипулирует, и при этом предохраняет их от вмешательства извне и неправильного использования. При связывании кода и данных создается объект. Другими словами, объект — это элемент, который поддерживает инкапсуляцию.
Код, данные или обе эти составляющие объекта могут быть закрытыми внутри него или открытыми. Закрытый код или закрытые данные известны лишь остальной части этого объекта и доступны только ей. Это означает, что к закрытому коду или данным не может получить доступ никакая другая часть программы, существующая вне этого объекта. Если код или данные являются открытыми, к ним (несмотря на то, что они определены внутри объекта) могут получить доступ другие части программы. Как правило, открытые части объекта используются для обеспечения управляемого интерфейса с закрытыми элементами. Основной единицей инкапсуляции в С# является класс. Класс определяет форму объекта. Он задает как данные, так и код, который будет оперировать этими данными.
В С# класс используется для создания объектов. Объекты — это экземпляры класса. Таким образом, класс — это по сути набор шаблонных элементов, которые показывают, как построить объект.
Код и данные, которые составляют класс, называются членами класса. Данные, определенные в классе, называются переменными экземпляра (instance variable), а код, который оперирует этими данными, — методами-членами (member method), или просто методами. «Метод» — это термин, применяемый в С# для обозначения подпрограммы.
Инкапсуляция, или утаивание информации, — это возможность скрыть внутреннее устройство объекта от его пользователей, предоставив через интерфейс доступ только к тем членам объекта, с которыми клиенту разрешается работать напрямую. Инкапсуляция подразумевает наличие границы между внешним интерфейсом класса (открытыми членами, видимыми пользователям класса) и деталями его внутренней реализации. Преимущество инкапсуляции для разработчика в том, что он может открыть те члены класса, которые будут оставаться статичными, или неизменяемыми, скрыв внутреннюю организацию класса, более динамичную и в большей степени подверженную изменениям. Как уже говорилось, в С# инкапсуляция достигается путем назначения каждому члену класса своего модификатора доступа — public, private или protected. Инкапсуляция позволяет изменить реализацию объекта без модификации основной части программы, если его интерфейс остался прежним. Простота модификации является важным критерием качества программы. Инкапсуляция позволяет использовать объект в другом окружении и быть уверенным в том, что он не испортит не принадлежащие ему области памяти, а также создавать библиотеки объектов для применения во многих программах.