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

9.2. Properties

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.

9.2.1. Getter (Get) en Setter (Set)

Specifiek voor een aantal programmeertalen zijn de Property constructies.  Deze vervangen de get-function en/of de set procedure (en worden ook zo op de achtergrond vertaald) :
Visual Basic 2012 Broncode - Codevoorbeeld 214
Namespace PropertyExample
    Class Person
        Private _Name As String
        Public Property Name() As String
            Get                                                            ' (1)
                Name = _Name
            End Get
            Set(ByVal value As String)                                     ' (2)
                _Name = value
            End Set
        End Property
    End Class
    Module Client
        Sub Main()
            Dim person1 As Person = New Person
            person1.Name = "John"                                          ' (3)
            Console.WriteLine(person1.Name)                                ' (4)
            '
            Console.ReadLine()
        End Sub
    End Module
End Namespace
Console Application Output
John
De getter (1) van de property wordt uitgevoerd wanneer de property wordt uitgelezen (4).  De setter (2) wordt uitgevoerd bij het instellen van de property waarde (3).  De toegekende waarde (hier de String literal "John") wordt ge-assigneerd aan de argument variable value van de setter.

Zoals je merkt is de implementatie van de getter en setter identiek aan respectievelijk de get functie en set procedure uit volgend voorbeeld.
Beide voorbeelden bevatten een gelijke abstratie van een persoon, een persoon heeft een naam, die men kan instellen en opvragen.

Anders is wel het gebruik voor de client.  Deze client kan de property nu aanspreken alsof het een publiek veld zou betreffen van dat object.
De toekenning aan deze property (3) gebeurt op dezelfde wijze als een toekenning aan een String variabele.
Het uitlezen van de property (4) vormt hier een String expressie, net zoals de aanroep naar de get functie uit vorig voorbeeld.  Dit maakt ook duidelijk dat het hier een String expressie zal zijn die als returnwaarde wordt opgegeven in de getter van de property.

De argumentvariabele van de setter krijgt by default de identifier value, dit kan aangepast worden, maar hier is echter geen reden toe.
Wat niet aangepast kan worden, of wat steeds gelijk moet zijn, is het type vermeld in de As clausule van de signatuurregel van de property zelf en het type vermeld in de As clausule van de signatuurregel van de setter ( in bovenstaand voorbeeld dus beide String).
Visual Basic 2012 Broncode - Codevoorbeeld 215
Namespace SetProcedureAndGetFunctionInsteadOfPropertyExample
    Class Person
        Private _Name As String
        Public Sub SetName(ByVal value As String)
            _Name = value
        End Sub
        Public Function GetName() As String
            GetName = _Name
        End Function
    End Class
    Module Client
        Sub Main()
            Dim person1 As Person = New Person
            person1.SetName("John")
            Console.WriteLine(person1.GetName())
            '
            Console.ReadLine()
        End Sub
    End Module
End Namespace
Console Application Output
John
Ook via een publiek veld kunnen we in de client op dezelfde wijzen een eigenschap inlezen of uitlezen :
Visual Basic 2012 Broncode - Codevoorbeeld 216
Namespace PublicFieldInsteadOfPropertyExample
    Class Book
        Public Title As String
    End Class
    Module Client
        Sub Main()
            Dim book1 As Book = New Book
            book1.Title = "Some Title"
            Console.Write(book1.Title)
            '
            Console.ReadLine()
        End Sub
    End Module
End Namespace
Console Application Output
Some Title
Het voordeel van het werken met een Property constructie is echter dat er nu binnen de implementatie van de getter en de setter ruimte is voor validatie.
De getter kan bijvoorbeeld de inhoud van het veld (gebruikt voor de opslag van de eigenschap) valideren (en/of bewerken) alvorens de terugkeerwaarde in te stellen.  De setter kan dan bijvoorbeeld de toegekende waarde (inhoud van value) valideren (en/of bewerken) alvorens het gerelateerde veld op te vullen.

Validatie is natuurlijk geen specifiek kenmerk voor de Property constructie, ook in getfunctions en setprocedures kan gelijkaardige validatie gebeuren.

Velden worden zelden publiek gemaakt.  Deze zijn immers doorgaans louter noodzakelijk om een toestand te bewaren.  Het bewaren van een toestand is een implementatiekwesties.  En implementatiekwesties worden steeds ingekapseld.

Tot en met versie 2005 waren er weinig significante voordelen van het gebruik van properties in tegenstelling tot het gebruik van get functions en set procedure.  De keuze voor een van beide was dan ook vooral afhankelijk van de voorkeur van de auteur van de klasse.
Sedert Visual Basic 2008 biedt het gebruik van properties in tegenstelling tot het gebruik van set procedures en get functies meerdere voordelen.
Verschillende design coding guidelines geven aan dat men properties gebruikt indien je rechtstreekse werkt op een ingekapseld veld die de respresentatie van deze eigenschap verwezelijkt en anderzijds getfuncties en setprocedures gaat gebruiken indien de implementatie complexer is (en een langere uitvoeringstijd nodig heeft) dan het rechtstreekse gebruik van een ingekapseld veld.

Bemerk dat de identifier van Propertys doorgaans zelfstandig-naamwoorden ( bijvoorbeeld Name) zullen zijn, in tegen stelling tot methods die doorgaans een werkwoord of een combinatie van een werkwoord en een zelfstandig-naamwoord (bijvoorbeeld GetName, SetName, ...) zullen zijn.

9.2.2. Access Modifiers voor Getters en Setters

De access modifier van enkel de getter of enkel setter van een property kan beperkt worden (bijvoorbeeld Private in plaats van Public) ten aanzien van de property zelf.

Hieronder beschikt een Counter klasse over een publieke Value property met een ingekapselde setter (1) :
Visual Basic 2012 Broncode - Codevoorbeeld 217
Namespace PrivateSetterExample
    Class Counter
        Private _Value As Integer
        Public Property Value() As Integer
            Get
                Value = _Value
            End Get
            Private Set(ByVal value As Integer)                            ' (1)
                _Value = value
            End Set
        End Property
        Public Sub Raise()
            Value = Value + 1                                              ' (2)
        End Sub
    End Class
End Namespace
Binnen de klasse zelf kan Value zowel uitgelezen als ingelezen worden (2), alle members van een klasse (of ze nu ingekapseld zijn of niet) zijn immers beschikbaar binnen de klasse zelf.

Zoals hieronder gedemonstreerd, is het voor clients niet mogelijk om de setter van de property Value te gebruiken (3).
Visual Basic 2012 Broncode - Codevoorbeeld 218
Namespace PrivateSetterExample
    Module Client
        Sub Main()
            Dim counter1 As Counter = New Counter
            Console.WriteLine(counter1.Value)
            '
            counter1.Raise()
            Console.WriteLine(counter1.Value)
            '
            counter1.Raise()
            Console.WriteLine(counter1.Value)
            '
            'counter1.Value = 5            ' impossible, no available setter (3)
            '
            Console.ReadLine()
        End Sub
    End Module
End Namespace
Console Application Output
0
1
2
Men bekomt hier voor client als het ware een "readonly" eigenschap.  Binnen de klasse zelf is de property echter wel "writeable".

Abstractiegewijs komt het zelden voor dat getters worden ingekapseld wanneer de setter publiek toegankelijk is.

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