ПОНЯТНО О Visual Basic NET (том 2)

Перечисления


С перечислениями мы с вами сталкивались не раз. Каждый раз под перечислением понимался список значений какого-нибудь свойства или параметра, или чего-нибудь другого. Например, в 12.3.6мы использовали перечисление RotateFlipType в качестве параметра метода. У этого перечисления 16 значений, из которых можно выбирать любое.

Все перечисления, с которыми мы сталкивались, были созданы заранее профессиональными программистами, включены ими в библиотеку классов .NET Framework и достались нам готовыми к употреблению. Нам осталось только с удобством выбирать значения из всплывающего списка. Однако в реальном программировании часто встречаются ситуации, когда необходимо иметь перечисление, еще никем не созданное.

Пример 1. Пусть вам хотелось бы с удобством пользоваться списком своих любимых футбольных команд:

Real, MU, Вперед, Milan

VB позволяет вам самому создать такое (и вообще, какое угодно) перечисление и пользоваться им. Вот что нужно для этого сделать.

Сначала в верхней части окна кода, вне процедур, пишем такой текст:

Enum Мои_команды

        Real

        MU

        Вперед

        Milan

End Enum

Это не процедура, хоть и похожа. Слово Enum означает, что это перечисление. Мы придумали ему имя Мои_команды. Слова End Enum означают конец перечисления.



Это и не переменная. Вы не можете написать

Мои_команды = Вперед

То, что мы создали, это новый тип. Тип Мои_команды. Впервые мы не просто пользуемся типом, а создаем тип.

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

Dim Команда As Мои_команды

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

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

Команда =

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


Команда = Мои_команды.Milan
Теперь вы можете как угодно работать с переменной. Например, так:
        If Команда = Мои_команды.Real Then MsgBox("Это не команда, а сборная мира!")
Пример 2. Все значения перечисления пронумерованы, начиная с нуля. Поэтому при работе с ними удобно применять операторы цикла. Проиллюстрирую работу с переменными перечислимого типа на примере перечисления дней недели:
Public Class Form1
    Inherits System.Windows.Forms.Form
Windows Form Designer generated code
    Enum Дни
        понедельник
        вторник
        среда
        четверг
        пятница
        суббота
        воскресенье
    End Enum
    Dim День As Дни
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        День = 0
        Debug.WriteLine(День)                           'понедельник
        День = 1
        Debug.WriteLine(День)                           'вторник
        День = Дни.понедельник
        Debug.WriteLine(День)                                 'понедельник
        День = День + 2
        Debug.WriteLine(День)                                 'среда
        День = Дни.среда
        Do Until День = Дни.воскресенье
            День = День + 1
            Debug.WriteLine(День)                       'четверг   пятница   суббота   воскресенье
        Loop
        For День = Дни.вторник To Дни.четверг
            Debug.WriteLine(День)                       'вторник   среда   четверг 
        Next
        For День = Дни.воскресенье To Дни.понедельник Step -2
            Debug.WriteLine(День)                      'воскресенье   пятница   среда  понедельник 
        Next
    End Sub
End Class
Пояснения: То, что напечатают операторы этой программы, вы видите в комментариях. Поскольку все значения перечисления пронумерованы, то, например, все равно, как написать:
        День = 1
или
        День = Дни.вторник
Пример 3. В этом примере вы увидите, как можно анализировать с пользой для дела переменные перечислимого типа. Предполагается, что, как в предыдущем примере, определены тип Дни и переменная День.


    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        День = InputBox("Введите номер дня недели")
        Select Case День - 1                                           ' Чтобы понедельник был не нулевым, а первым
            Case Дни.понедельник To Дни.среда
                MsgBox("Начало недели")
            Case Дни.четверг, Дни.пятница
                MsgBox("Середина недели")
            Case Дни.суббота, Дни.воскресенье
                MsgBox("Отдых")
            Case Is > Дни.воскресенье, Is < Дни.понедельник
                MsgBox("Таких дней не бывает")
        End Select
    End Sub
Пояснения: Обратите внимание, что вводить день недели привычным образом буквами просто так не удастся, так как информация, вводимая в текстовое поле окна InputBox имеет тип String, который автоматически не преобразуется в перечислимый. Поэтому я выбрал ввод номера дня недели.
Настоящую пользу из собственных перечислений вы начнете извлекать в проекте «Будильник-секундомер» и когда изучите массивы.

Содержание раздела