Visual Basic 2012 Voorbeelden
   

visual basic 2012 broncode voorbeelden

Blijf op de hoogte van de recente aanpassingen op vbvoorbeelden!

Microsoft Visual Studio 2012Microsoft Developers Network - Visual BasicMicrosoft .NET Framework

17.1. Enumeraties - Enum Datatypes

Print Email Deel op Twitter Deel op Facebook

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.

Stel we hebben in ons systeem Customer objecten waarbij hun leeftijdscategorie (AgeCategory) voor het systeem belangrijk is om bepaalde logica op te baseren.
Voor het systeem zijn er bijvoorbeeld drie leeftijdscategorieën waarbij steeds bepaalde logica gepaard gaat, er wordt in het systeem gesproken over de categorieën Child, Adult en Retired.
Een voorbeeld van logica die hiermee gepaard zou kunnen gaan is de van de AgeCategory afhankelijke kortingspercentage (GetDiscountPercentage()).
Gezien de AgeCategory van een Customer afhankelijk is van de Age van de Customer is het logisch in de Customer definitie de verantwoordelijkheid te stoppen om de AgeCategory van de bepaalde Customer instantie op te vragen (Customer is de "information expert" van deze verantwoordelijkheid).

Om de lijst in ons systeem te definiëren/opsommen kunnen we gebruik maken van een enumeratie.  Een enumeratie is een eenvoudige typedefinitie waarbij men enkel de mogelijke enumeratie-/opsommingswaarden dient te definiëren.

Net zoals andere typedefinities kan men nu variabelen van dit type gaan declareren (zie de ageCategory argumentvariabele) of dit type als returntype voor een functie gebruiken.

Men kan in een client verwijzen naar een enumeratiewaarde door de puntnotatie te gebruiken.  De identifier van de enumeratie wordt na de punt gevolgd door de identifier van de enumeratiewaarde.
Visual Basic 2012 Broncode - Codevoorbeeld 426
Option Explicit On
Option Strict Off
Enum AgeCategory
    Child
    Adult
    Retired
End Enum
Class Customer
    Public Property Age As Integer
    Public ReadOnly Property AgeCategory() As AgeCategory
        Get
            Select Case Age
                Case Is < 18
                    AgeCategory = AgeCategory.Child
                Case Is >= 60
                    AgeCategory = AgeCategory.Retired
                Case Else
                    AgeCategory = AgeCategory.Adult
            End Select
        End Get
    End Property
    Public Overrides Function ToString() As String
        ToString = Age.ToString() & " - " & AgeCategory.ToString()
    End Function
    Public Function GetDiscountPercentage() As Integer
        Select Case AgeCategory
            Case AgeCategory.Child : GetDiscountPercentage = 10
            Case AgeCategory.Adult : GetDiscountPercentage = 0
            Case AgeCategory.Retired : GetDiscountPercentage = 20
        End Select
    End Function
End Class
Class Example1
    Public Shared Sub Main()
        Dim customer1 As Customer = New Customer With {.Age = 15}
        Console.WriteLine("Age : " & customer1.ToString())
        Console.WriteLine("Discount : " & customer1.GetDiscountPercentage())
        '
        Dim customer2 As Customer = New Customer With {.Age = 45}
        Console.WriteLine("Age : " & customer2.ToString())
        Console.WriteLine("Discount : " & customer2.GetDiscountPercentage())
        '
        Dim customer3 As Customer = New Customer With {.Age = 75}
        Console.WriteLine("Age : " & customer3.ToString())
        Console.WriteLine("Discount : " & customer3.GetDiscountPercentage())
        '
        Console.ReadLine()
    End Sub
End Class
Console Application Output
Age : 15 - Child
Discount : 10
Age : 45 - Adult
Discount : 0
Age : 75 - Retired
Discount : 20

17.1.1. System.Enum Type

Ieder enumeratietype dat gedefinieerd wordt is een type dat impliciet afgeleid wordt van het System.Enum type (die in de klassenbibliotheek van het .NET FrameWork is voorgedefinieerd).  Van dat System.Enum type wordt een ToString() implementatie overgeërfd die de corresponderende tekstuele waarde oplevert van die enumeratiewaarde.

Een enumeratiedefinitie zou je kunnen vergelijken met het Boolean type, ook deze heeft een vaste reeks van waarden met een specifieke naam (True en False).

De enumeratiewaarden moet vastgelegd worden at designtime en kan dus na compiletime (bijvoorbeeld at runtime) niet meer wijzigen.

Aan elke enumeratiewaarde is een gehele numerieke waarde gekoppeld.  By default zijn dit Integer waarden.  De eerste enumeratiewaarde wordt gekoppeld aan 0, de volgende aan 1, de volgende aan 2, ... .

Men kan afwijken van het Integer datatype door een As clausule op te nemen na de identifier van de enumeratie.  Dit dient een geheel numeriek formaat te zijn (Byte, Short, Integer, Long, SByte, UShort, UInteger of ULong).  Men zou dergelijke afwijking kunnen doen om ofwel negatieve en positieve numerieke waarden te kunnen koppelen aan de enumeratiewaarden ofwel om de nodige opslagcapaciteit voor enumeratie instantie te beperken.
Visual Basic 2012 Broncode - Codevoorbeeld 427
Enum Month As Byte
    January = 1
    February = 2
    March = 3
    April = 4
    May = 5
    June = 6
    July = 7
    August = 8
    September = 9
    October = 10
    November = 11
    December = 12
End Enum
Class Example2
    Public Shared Sub Main()
        Dim month1 As Month
        Console.WriteLine(month1)
        Console.WriteLine(GetMonthName(month1))
        '
        month1 = Month.January
        Console.WriteLine(month1)
        Console.WriteLine(GetMonthName(month1))
        '
        Dim month2 As Month = 9
        Console.WriteLine(month2)
        Console.WriteLine(GetMonthName(month1))
        '
        If month1 < month2 Then                                            ' (1)
            Console.WriteLine(month1.ToString() & " comes before " & _
                              month2.ToString())
        Else
            Console.WriteLine(month1.ToString() & " does not come before " & _
                              month2.ToString())
        End If
        '
        Console.WriteLine(GetMonthName(5))
        Console.WriteLine(GetMonthName(13))
        '
        Dim month3 As Month = Month.January + Month.March                  ' (2)
        Console.WriteLine(GetMonthName(month3))
        '
        Console.WriteLine()
        For month As Month = month.January To month.December
            Console.WriteLine(GetMonthName(month))
        Next
        '
        Console.ReadLine()
    End Sub
    Public Shared Function GetMonthName(ByVal month As Month) As String
        If System.Enum.IsDefined(month.GetType(), month) Then
            GetMonthName = month.ToString()
        Else
            GetMonthName = "unknown"
        End If
    End Function
End Class
Console Application Output
0
unknown
1
January
9
January
January comes before September
May
unknown
April

January
February
March
April
May
June
July
August
September
October
November
December
In bovenstaande client merk je dat de inhoud een enumeratiewaarde correspondeert met de gekoppelde numerieke waarde.  Enkel bij het vormen vormen van de enumeratie expressie of bij het opvragen van de ToString() representatie zal de tekstuele vorm worden gebruikt.

Doordat de enumeratie waarde intern als numerieke waarden worden gerepresenteerd is het ook mogelijk vergelijkingen (1) of bewerkingen (2) met deze enumeratiewaarden te maken.

De GetType() method overgeërfd van de System.Enum klasse is bruikbaar om in System.Type vorm informatie over het desbetreffende type op te vragen.
Een System.Type object is een abstractie van een datatype, dit object bevat meta-data omtrent het ge-abstraheerde datatype.

Dergelijk System.Type object die een bepaald enumeratietype abstraheerd is nodig als eerste argument van de System.Enum.IsDefined classmethod.  Deze method levert True of False op naargelang de tweede (numerieke) enumeratiewaarde gedefinieerd is in het opgegeven enumeratietype ( opgegeven in het eerste argument).

17.1.2. Oefening

Opgave :

Zorg ervoor dat onderstaand clientcode onderstaand programmaverloop geeft.
Visual Basic 2012 Broncode - Codevoorbeeld 428
Class Exercise1Task
    Public Shared Sub Main()
        Dim property1 As New [Property] With {.Status = PropertyStatus.ToRent}
        Dim property2 As New [Property] With {.Status = PropertyStatus.ToBuy}
        Dim property3 As New [Property] With {.Status = PropertyStatus.ToRent}
        '
        Dim properties As New Properties
        properties.Add(property1)
        properties.Add(property2)
        properties.Add(property3)
        '
        Dim propertiesToRent As [Property]() = _
                                         properties.Items(PropertyStatus.ToRent)
        Console.WriteLine(propertiesToRent(0) Is Property1)
        Console.WriteLine(propertiesToRent(1) Is property3)
        '
        Dim propertiesToBuy As [Property]() = _
                                          properties.Items(PropertyStatus.ToBuy)
        Console.WriteLine(propertiesToBuy(0) Is property2)
        '
        '
        Console.ReadLine()
    End Sub
End Class
Console Application Output
True
True
True
Oplossing :
Visual Basic 2012 Broncode - Codevoorbeeld 429
Enum PropertyStatus
    ToBuy
    ToRent
End Enum
Class [Property]
    Public Property Status As PropertyStatus
End Class
Class Properties
    Private _Items As [Property]()
    Private _Count As Integer
    Public ReadOnly Property Count() As Integer
        Get
            Count = _Count
        End Get
    End Property
    Public Sub Add(ByVal item As [Property])
        ReDim Preserve _Items(Count)
        _Items(Count) = item
        _Count += 1
    End Sub
    Public ReadOnly Property Items(ByVal status As PropertyStatus) _
                                                                 As [Property]()
        Get
            Dim result As [Property]()
            Dim resultCount As Integer
            For Each [property] As [Property] In _Items
                If [property].Status = status Then
                    ReDim Preserve result(resultCount)
                    result(resultCount) = [property]
                    resultCount += 1
                End If
            Next
            Items = result
        End Get
    End Property
End Class

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.