Vb net конструктор класса

Обновлено: 02.05.2024

Обычно, чтобы использовать какой-нибудь класс, мы должны создать его объект. Однако если данный класс имеет статические или разделяемые методы, то чтобы получить к ним доступ, мы не обязательно должны использовать объекты. Например, создадим новый класс Algorithm и добавим в него две функции для вычисления числа Фибоначчи и факториала:

Обратите внимание на модификатор Shared, он указывает, что данные члены будут доступны для всего класса, то есть будут общими. В этом случае мы их можем использовать следующим образом:

В данном случае нам не надо создавать экземпляр или объект класса, мы можем обратиться к общему члену напрямую, указав только имя класса.

Статический конструктор

Мы можем объявлять в классах также и статические конструкторы:

Статические конструкторы выполняются при самом первом создании объекта данного класса:

Ключевое слово Static

Чтобы понять смысл модификатора Static, сначала посмотрим на примере, в котором целесообразно его использование. Итак, у нас определен цикл:

В этом цикле у нас определена переменная temp , которая после вывода на экран ее значения увеличивается на единицу. Однако при каждом новом проходе цикла эта переменная создается заново, и ее значение при выводе на экран всегда будет равно 4. Однако если мы заменим Dim на Static, то значение переменной при каждом новом проходе будет сохраняться, и при выводе на экран мы увидим, что ее значение увеличивается:

Посмотрим на другом примере. Создадим метод со статической переменной, которая будет увеличиваться на единицу и отображаться на экране. И затем дважды вызовем этот метод:

Мы увидим, что несмотря на то, что вызов метода был завершен, значение переменной сохранилось, а при следующем вызове оно равно не 6, а 7. Тогда как если бы мы заменили слово Static на Dim, переменная после работы метода уничтожалась, а при следующем вызове метода создавалась бы вновь. В тоже время вместо переменной Static, мы можем использовать глобальную переменную на уровне класса или модуля.

И Static, и Shared могут использоваться в качестве модификаторов переменных. Однако отличие между ними состоит в том, что с помощью Static определяются переменные внутри методов, а с помощью Shared - переменные на уровне классов и модулей.

В этом пошаговом руководстве показано, как определить классы, которые затем можно использовать для создания объектов. Здесь также показано, как добавить свойства и методы в новый класс, а также как инициализировать объект.

Отображаемые на компьютере имена или расположения некоторых элементов пользовательского интерфейса Visual Studio могут отличаться от указанных в следующих инструкциях. Это зависит от имеющегося выпуска Visual Studio и используемых параметров. Дополнительные сведения см. в разделе Персонализация среды IDE.

Определение класса

Создайте проект, щелкнув "Создать Project" в меню "Файл". Откроется диалоговое окно Создание проекта .

Выберите Windows приложение из списка шаблонов проектов Visual Basic, чтобы отобразить новый проект.

Добавьте новый класс в проект, нажав кнопку "Добавить класс" в меню Project. Откроется диалоговое окно Добавление нового элемента.

Выберите шаблон класса .

Присвойте новому классу UserNameInfo.vb имя и нажмите кнопку "Добавить ", чтобы отобразить код для нового класса.

Редактор кода Visual Basic можно использовать для добавления класса в форму запуска, введя ключевое Class слово, за которым следует имя нового класса. Редактор кода предоставляет для вас соответствующую End Class инструкцию.

Определите частное поле для класса, добавив следующий код между Class операторами и End Class операторами:

Объявление поля как Private означает, что его можно использовать только в классе. Поля можно сделать доступными из-за пределов класса с помощью модификаторов доступа, таких как Public предоставление большего доступа. Дополнительные сведения см. в разделе "Уровни доступа" в Visual Basic.

Определите свойство для класса, добавив следующий код:

Определите метод для класса, добавив следующий код:

Определите параметризованный конструктор для нового класса, добавив процедуру с именем Sub New :

Sub New Конструктор вызывается автоматически при создании объекта на основе этого класса. Этот конструктор задает значение поля, которое содержит имя пользователя.

Создание кнопки для тестирования класса

Измените форму запуска на режим конструктора, щелкнув правой кнопкой мыши его имя в Обозреватель решений и выбрав конструктор представлений. По умолчанию форма запуска для проектов приложений Windows называется Form1.vb. Затем появится основная форма.

Добавьте кнопку в основную форму и дважды щелкните ее, чтобы отобразить код обработчика Button1_Click событий. Добавьте следующий код для вызова процедуры тестирования:

Запуск приложения

Visual Basic обеспечивает полную поддержку объектно-ориентированного программирования, включая инкапсуляцию, наследование и полиморфизм.

Инкапсуляция означает, что группа связанных свойств, методов и других членов рассматривается как единый элемент или объект.

Наследование описывает возможность создания новых классов на основе существующих классов.

Полиморфизм означает, что можно иметь несколько взаимозаменяемых классов, даже если каждый класс реализует одни и те же свойства или методы разными способами.

В этом разделе рассматриваются следующие понятия.

Классы и объекты

Термины класс и объект часто взаимозаменяемы, но в действительности классы описывают типы объектов, а объекты — это используемые экземпляры классов. Поэтому процесс создания объекта называется созданием экземпляра. Если использовать сравнение с чертежом, то класс является чертежом, а объект является зданием, построенным по нему.

Visual Basic также предоставляет облегчаемую версию классов, называемых структурами, которые полезны при создании большого массива объектов и не хотят использовать слишком много памяти для этого.

Дополнительные сведения см. в разделе:

Члены класса

Каждый класс может состоять из различных членов класса, которые содержат свойства, описывающие данные класса, методы, задающие поведение класса, и события, обеспечивающие связь между различными классами и объектами.

Свойства и поля

Поля и свойства представляют сведения, содержащиеся в объекте. Поля подобны переменным в том, что их можно прочитать или изменить напрямую.

Для работы со свойствами используются процедуры "Get" и "Set", которые расширяют возможности управления способом задания и возврата значений.

Visual Basic позволяет создать частное поле для хранения значения свойства или использовать так называемые автоматически реализуемые свойства, которые автоматически создают это поле и предоставляют базовую логику для процедур свойств.

Определение автоматически реализуемого свойства:

Если требуется выполнить дополнительные операции чтения и записи применительно к значению свойства, определите поле для хранения значения свойства и затем реализуйте базовую логику для хранения и извлечения этого значения:

У большинства свойств есть методы или процедуры для задания и возврата значения свойства. Однако можно создать свойства, доступные только для чтения или только на запись, чтобы запретить изменение или чтение значений свойств. Для этого в Visual Basic можно использовать ключевые слова ReadOnly и WriteOnly . Следует отметить, что автоматически реализуемые свойства нельзя сделать доступными только для чтения или только для записи.

Дополнительные сведения см. в разделе:

Методы

Действие, которое выполняет объект, называется методом.

В Visual Basic существует два способа создания метода: с помощью оператора Sub (если метод не возвращает значение) или с помощью оператора Function (если метод возвращает значение).

Определение метода класса:

Класс может иметь несколько реализаций или перегрузок одного и того же метода, которые отличаются от других числом или типами параметров.

Как правило, метод объявляется при определении класса. Однако Visual Basic также поддерживает методы расширения, позволяющие добавлять методы в существующий класс вне фактического определения класса.

Дополнительные сведения см. в разделе:

Конструкторы

Конструкторы — это методы классов, выполняемые автоматически при создании объекта заданного типа. Обычно конструкторы выполняют инициализацию членов данных нового объекта. Конструктор можно запустить только один раз при создании класса. Кроме того, код конструктора всегда выполняется раньше всех остальных частей кода в классе. Следует отметить, что так же, как и для других методов, можно создать несколько перегрузок конструктора.

Определение конструктора для класса:

Деструкторы

События

События позволяют классу или объекту уведомлять другие классы или объекты о возникновении каких-либо ситуаций. Класс, отправляющий (или порождающий) событие, называется издателем, а классы, принимающие (или обрабатывающие) событие, называются подписчиками. Дополнительные сведения о том, как порождаются и обрабатываются события, см. в разделе События.

Чтобы объявить события, используйте оператор Event.

Чтобы вызвать события, используйте оператор RaiseEvent.

Чтобы указать обработчики событий с помощью декларативного способа, используйте инструкцию WithEvents и предложение Handles .

Чтобы динамически добавлять, удалять и изменять обработчик событий, связанный с событием, используйте оператор AddHandler и RemoveHandler вместе с оператором AddressOf.

Вложенные классы

Класс, определенный внутри другого класса, называется вложенным. По умолчанию вложенный класс является частным.

Чтобы создать экземпляр вложенного класса, укажите имя класса контейнера и имя вложенного класса, используя в качестве разделителя точку:

Модификаторы доступа и уровни доступа

С помощью модификаторов доступа все классы и члены классов могут указывать уровни доступа, предоставляемые другим классам.

Имеющиеся модификаторы доступа указаны в следующей таблице.

Модификатор Visual Basic Определение
Public Доступ к типу или члену возможен из любого другого кода в той же сборке или другой сборке, ссылающейся на него.
Частная Доступ к типу или члену можно получить только из кода в том же классе.
Защищены Доступ к типу или члену можно получить только из кода в том же классе или в производном классе.
Друг Доступ к типу или члену возможен из любого кода в той же сборке, но не из другой сборки.
Protected Friend Доступ к типу или члену возможен из любого кода в той же сборке, или из производного класса в другой сборке.

Создание экземпляров классов

Чтобы создать объект, необходимо создать экземпляр класса.

После создания экземпляра класса можно присваивать значения свойствам и полям экземпляра и вызывать методы класса.

Чтобы назначить значения свойствам в процессе создания экземпляра класса, используйте инициализаторы объектов:

Дополнительные сведения можно найти в разделе

Общие классы и члены

Общий член класса — это свойство, процедура или поле, совместно используемое всеми экземплярами класса.

Чтобы определить общий член, выполните следующие действия.

Чтобы получить доступ к общему члену, используйте имя класса без создания объекта этого класса:

Общие модули в Visual Basic имеют только общие члены и не могут быть созданы. Общие члены также не могут получить доступ к не общим свойствам, полям или методам

Дополнительные сведения см. в разделе:

Анонимные типы

Анонимные типы позволяют создавать объекты без написания определения класса для типа данных. Вместо этого компилятор создает класс для вас. Данный класс не имеет имени и содержит свойства, которые указаны при объявлении объекта.

Создание экземпляра анонимного типа:

Дополнительные сведения можно найти в разделе Анонимные типы.

Наследование

Visual Basic не поддерживает множественное наследование. То есть можно указать только один базовый класс для производного класса.

Наследование от базового класса:

По умолчанию унаследовать класс можно от любого класса. Однако можно указать, должен ли класс использоваться в качестве базового класса, или создать класс, который может использоваться только в качестве базового.

Указание, что класс не может использоваться в качестве базового класса:

Указание, что класс может использоваться только в качестве базового класса и нельзя создать экземпляр этого класса:

Дополнительные сведения можно найти в разделе

Переопределение элементов

По умолчанию производный класс наследует все члены от своего базового класса. Если необходимо изменить поведение унаследованного члена, необходимо переопределить его. Т. е. в производном классе можно определить новую реализацию метода, свойства или события.

Следующие модификаторы используются для управления переопределением свойств и методов.

Модификатор Visual Basic Определение
Overridable Разрешает переопределение члена класса в производном классе.
Переопределения Переопределяет виртуальный (переопределяемый) член в базовом классе.
NotOverridable Запрещает переопределение члена в наследующем классе.
MustOverride Требует, чтобы член класса был переопределен в производном классе.
Тени Скрывает член, наследуемый от базового класса

Интерфейсы

Интерфейсы, как и классы, определяют набор свойств, методов и событий. Но, в отличие от классов, интерфейсы не предоставляют реализацию. Они реализуются классами, но определяются как отдельные от классов сущности. Интерфейс представляет собой контракт, в котором класс, реализующий интерфейс, должен реализовывать каждый аспект этого интерфейса в точном соответствии с его определением.

Реализация интерфейса в классе:

Дополнительные сведения см. в разделе:

Универсальные шаблоны

Определение универсального класса:

Создание экземпляра универсального класса:

Дополнительные сведения можно найти в разделе

Делегаты

Делегат — это тип, который определяет сигнатуру метода и может обеспечивать связь с любым методом с совместимой сигнатурой. Метод можно запустить (или вызвать) с помощью делегата. Делегаты используются для передачи методов в качестве аргументов к другим методам.

Обработчики событий — это ничто иное, как методы, вызываемые с помощью делегатов. Дополнительные сведения об использовании делегатов при обработке событий см. в разделе События.

Создание ссылки на метод, сигнатура которого соответствует сигнатуре, указанной делегатом:

Экземпляр класса, объект, создается с помощью ключевого слова New . Задачи инициализации зачастую необходимо выполнять на новых объектах до их использования. К распространенным задачам инициализации относится открытие файлов, подключение к базам данных и чтение значений параметров реестра. Visual Basic управляет инициализацией новых объектов с помощью процедур, называемых конструкторами (специальные методы, позволяющие контролировать инициализацию).

Когда объект выходит из области, он высвобождается средой CLR. Visual Basic управляет выпуском системных ресурсов с помощью процедур, называемых деструкторами. Вместе конструкторы и деструкторы поддерживают создание надежных и предсказуемых библиотек класса.

Использование конструкторов и деструкторов

Конструкторы и деструкторы управляют созданием и уничтожением объектов. Процедуры Sub New в Visual Basic инициализации Sub Finalize и уничтожения объектов; они заменяют Class_Initialize методы, Class_Terminate используемые в Visual Basic 6.0 и более ранних версиях.

Конструктор Sub New

Конструктор Sub New может быть запущен только один раз при создании класса. Его нельзя вызвать явным образом нигде, кроме первой строки кода другого конструктора этого же класса или производного класса. Более того, код метода Sub New всегда выполняется до любого другого кода в классе. Visual Basic неявно создает Sub New конструктор во время выполнения, если явно не определена Sub New процедура для класса.

Чтобы создать конструктор класса, создайте процедуру с именем Sub New в любом месте определения класса. Чтобы создать конструктор с параметрами, укажите имена и типы данных аргументов в Sub New точно так же, как для любой процедуры. См. следующий код:

Конструкторы часто перегружены, как в следующем коде:

При вызове класса, производного от другого класса, первая строка конструктора должна представлять собой вызов конструктора базового класса (кроме случаев, когда в базовом классе есть доступный конструктор, не принимающий параметры). Вызов базового класса, содержащего указанный выше конструктор, может быть, к примеру, таким MyBase.New(s) . MyBase.New В противном случае является необязательным, а среда выполнения Visual Basic вызывает ее неявно.

После написания кода для вызова конструктора родительского объекта можно добавить дополнительный код инициализации к процедуре Sub New . Sub New может принимать аргументы при вызове в качестве конструктора с параметрами. Эти параметры передаются из процедуры, вызывающей конструктор, например, Dim AnObject As New ThisClass(X) .

Sub Finalize

Перед высвобождением объектов среда CLR автоматически вызывает метод Finalize для объектов, определяющих процедуру Sub Finalize . Метод Finalize может содержать код, который необходимо выполнить непосредственно перед уничтожением объекта, например, код для закрытия файлов и сохранения информации о состоянии. Существует небольшой спад производительности при выполнении Sub Finalize , поэтому метод Sub Finalize нужно определять только в тех случаях, когда требуется явное высвобождение объектов.

Сборщик мусора в среде CLR не удаляет неуправляемые объекты, которые операционная система выполняет напрямую за пределами среды CLR. Причина состоит в том, что разные неуправляемые объекты следует уничтожать по-разному. Эта информация не связана напрямую с неуправляемым объектом, ее необходимо найти в документации по объектам. Класс, использующий неуправляемые объекты, должен удалить их в своем методе Finalize .

Деструктор Finalize является защищенным методом, который можно вызвать только из класса, к которому он принадлежит, или из производного класса. Система автоматически вызывает Finalize при уничтожении объекта, поэтому не следует явным образом вызывать Finalize извне реализации Finalize производного класса.

Деструктор Finalize не должен создавать исключений, поскольку они не обрабатываются приложением и могут привести к завершению работы приложения.

Как методы New и Finalize работают в иерархии классов

При каждом создании экземпляра класса среда CLR пытается выполнить процедуру New , если она существует в этом объекте. New — тип процедуры, которая называется constructor и используется для инициализации новых объектов до выполнения всего остального кода в объекте. Конструктор New можно использовать для открытия файлов, подключения к базам данных, инициализации переменных и для других задач, которые необходимо выполнить перед использованием объекта.

Когда создается экземпляр производного класса, конструктор Sub New базового класса выполняется в первую очередь, а затем — конструкторы в производных классах. Это происходит, поскольку первая строка кода в конструкторе Sub New использует синтаксис MyBase.New() для вызова конструктора класса на один уровень выше себя в иерархии классов. Затем конструктор Sub New вызывается для каждого класса в иерархии вплоть до достижения базового класса. На этом этапе выполняется код в конструкторе базового класса, а затем выполняется код в каждом конструкторе всех производных классов; код в производном классе самого дальнего уровня выполняется последним.

Когда объект больше не нужен, среда CLR вызывает метод Finalize для этого объекта перед высвобождением памяти. Метод Finalize называется destructor , поскольку он выполняет задачи очистки, такие как сохранение информации о состоянии, закрытие файлов и подключений к базам данных, а также прочие задачи, которые необходимо выполнить перед высвобождением объекта.

Интерфейс IDisposable

Экземпляры классов зачастую управляют ресурсами, которыми не управляет среда CLR, такими как дескрипторы Windows и подключения к базам данных. От этих ресурсов нужно избавляться в методе Finalize класса, поэтому они будут высвобождаться при уничтожении объекта сборщиком мусора. Тем не менее, сборщик мусора уничтожает объекты только в тех случаях, когда среде CLR нужно больше свободной памяти. Это означает, что ресурсы могут быть не высвобождены еще в течение долгого времени после того, как объект выйдет из области.

Чтобы дополнить сборку мусора, ваши классы могут предоставлять механизм активного управления системными ресурсами путем реализации интерфейса IDisposable. В IDisposable существует метод Dispose, который клиенты должны вызывать по завершении использования какого-либо объекта. Можно использовать метод Dispose для немедленного высвобождения ресурсов и выполнения таких задач как закрытие файлов и подключений к базам данных. В отличие от деструктора Finalize , метод Dispose не вызывается автоматически. Клиенты класса должны явным образом вызвать Dispose, когда нужно немедленно высвободить ресурсы.

Использование IDisposable

Класс, реализующий интерфейс IDisposable, должен включать следующие разделы кода:

Поле, чтобы отслеживать, уничтожен ли объект:

Перегрузка Dispose для высвобождения ресурсов класса. Этот метод должен вызываться методами Dispose и Finalize базового класса:

Реализация Dispose, содержащая только следующий код:

Переопределение метода Finalize , содержащее только следующий код:

Производное создание от класса, реализующего IDisposable

Классу, производному от базового класса, реализующего интерфейс IDisposable, нет необходимости переопределять какие-либо базовые методы, если только производный класс не использует дополнительные ресурсы, которые следует высвобождать. В этом случае производный класс должен переопределять метод Dispose(disposing) базового класса, чтобы удалить ресурсы производного класса. Это переопределение должно вызвать метод Dispose(disposing) базового класса.

Производный класс не должен переопределять методы Dispose и Finalize базового класса. Когда эти методы вызываются из экземпляра производного класса, реализация этих методов в базовом классе вызывает переопределение метода Dispose(disposing) производного класса.

Сбор мусора и деструктор Finalize

CLR периодически уничтожает объекты, если система определяет, что эти объекты больше не нужны. Объекты высвобождаются быстрее при нехватке системных ресурсов и медленнее в других случаях. Задержка между потерей объектом области и высвобождением объекта средой CLR означает, что в отличие от объектов в Visual Basic 6.0 и более ранних версиях, невозможно точно определить, когда объект будет уничтожен. В такой ситуации объекты, как говорят, имеют недетерминированное время существования. В большинстве случаев неопределенное время жизни не влияет на написание приложений, если помнить о том, что деструктор Finalize может быть выполнен не сразу после потери объектом области.

Еще одно отличие от систем сборки мусора заключается в использовании Nothing . Чтобы воспользоваться подсчетом ссылок в Visual Basic 6.0 и более ранних версиях, программисты часто назначали Nothing переменным объектов, чтобы высвобождать ссылки, удерживаемые этими переменными. Если переменная содержала последнюю ссылку на объект, ресурсы объекта были немедленно высвобождены. В более поздних версиях Visual Basic, хотя по-прежнему могут быть случаи, когда эта процедура еще применима, ее выполнение больше не приводит к немедленному высвобождению ресурсов объектом. Чтобы немедленно высвободить ресурсы, используйте метод объекта Dispose, если он доступен. Для переменной следует устанавливать значение Nothing лишь в тех случаях, когда ее время жизни достаточно велико по отношению ко времени, за которое сборщик мусора обнаруживает потерянные объекты.

Всю функциональность класса обеспечивают его члены - поля, свойства, методы, конструкторы, события. Поля представляют обычные переменные? обычным образом также определяются процедуры и функции (в этом плане классы во многом похожи на структуры):

Кроме обычных методов в классах существуют специальные методы - конструкторы . Конструкторы вызываются при создании нового объекта класса. Чтобы объявить конструктор, надо использовать ключевое слово New . Зачем нужен конструктор? Обычно конструктор выполняет инициализацию членов класса. Объявим в классе конструктор, который будет инициализировать поля нашего класса Book:

Здесь мы создали конструктор, который принимает три параметра - название книги, ее автора и год издания. Затем в конструкторе мы присваиваем значения параметров полям класса. Поскольку параметры и поля класса называются одинаково, то нам надо использовать ключевое слово Me , которое предоставляет ссылку на данный класс. Если бы параметры имели другие имена, то использование слова Me было бы необязательным. Если мы не создадим свой конструктор, тогда будет использоваться конструктор по умолчанию:

Теперь используем класс. Создайте новое консольное приложение. Затем нажмите правой кнопкой мыши на название проекта в окне Solution Explorer (Обозреватель решений) и в появившемся меню выберите пункт Add (Добавить) , в другом появившемся меню выберите пункт Class (Класс) . В окне создания нового класса присвойте ему имя Book и нажмите кнопку Add (Добавить) . В проект будет добавлен новый класс Book , который будет находиться в файле Book.vb . Перенесите в этот класс следующий код:

Теперь в основной файл приложения - в модуль добавим следующий код:

Если мы запустим код на выполнение, то консоль выведет нам информацию о книгах b1 и b2. Обратите внимание, что чтобы создать новый объект кроме конструктора нам надо использовать ключевое слово New . В первом случае мы используем свой конструктор, а во втором - конструктор по умолчанию.

Частичные классы

Частичные классы представляют возможность разделения одного класса на несколько файлов. Например, в одном файле может быть:

Для создания частичного класса перед его объявлением надо поставить ключевое слово Partial . В итоге в результате компиляции будет создан единый класс, который не будет отличаться от других классов.

Ключевое слово With

Предположим, что у нас есть следующий класс State :

При создании объекта класса мы указываем столицу, значения для остальных полей мы должны указать отдельно, например так:

Однако таких свойств может быть множество. И чтобы сократить объем кода, мы можем использовать конструкцию With. End With . Чтобы применить эту конструкцию, после слова With указывается объект, а затем построчно свойства объекта, которые мы хотим получить или присвоить:

Кроме того, мы можем использовать сокращенный синтаксис инициализации объекта с помощью ключевого слова With и одновременно указать все необходимые свойства:

Читайте также: