Property in Visual Basic dient voor het encapsuleren van toegang tot de gegevens van een object met de mogelijkheid van controle, berekeningen en toewijzing van toegangsniveaus. Eigenschappen bevatten Get-blokken (voor het lezen van waarden) en Set-blokken (voor het instellen van waarden).
Private _age As Integer Public Property Age() As Integer Get Return _age End Get Set(ByVal value As Integer) If value < 0 Or value > 120 Then Throw New ArgumentException("Leeftijd moet tussen 0 en 120 zijn!") End If _age = value End Set End Property
Met zo'n eigenschap kan validatie van waarden, caching, on-the-fly berekeningen, enz. worden geïmplementeerd, en voor de gebruiker lijkt het object hetzelfde als een gewoon veld.
Public Property ItemId As Integer ' maakt automatisch een verborgen veld aan, geen toegang tot de logica
Nuance: automatische eigenschappen kunnen niet worden uitgebreid met interne logica zonder expliciete declaratie van get/set.
Vraag: Is het mogelijk om een eigenschap in Visual Basic te implementeren met alleen een publieke set en een privé get? Hoe stel je verschillende toegangsniveaus voor get en set in?
Antwoord: Ja, vanaf VB.NET is het mogelijk om verschillende toegangsniveaus voor get en set op te geven:
Public Property Salary As Decimal Private Get Return _salary End Get Set(ByVal value As Decimal) _salary = value End Set End Property
In dit voorbeeld kan alleen de klasse de waarde van Salary verkrijgen, externe objecten kunnen deze alleen instellen.
Verhaal
Een ontwikkelaar gebruikte automatische eigenschappen voor alle velden van een businessobject. Later werd validatie voor negatieve waarde-invoer noodzakelijk, maar het veranderen van de auto-eigenschap naar expliciet vereiste het handmatig aanpassen van een groot deel van de code, wat leidde tot fouten en arbeidskosten.
Verhaal
Tijdens de migratie van VB6 naar VB.NET werd een deel van de eigenschappen als velden met publieke toegangsmethoden geïmplementeerd: dit opende volledige ongeoorloofde toegang tot de interne gegevens van de klasse, wat leidde tot ongewenste modificaties van de staat door externe objecten.
Verhaal
In een complex object bevatte de eigenschap in het get-blok extra berekeningen, inclusief bestandsverwerking. Bij frequente aanroepen van de eigenschap daalde de prestaties van de applicatie drastisch; het bleek dat het beter was om een privé-veld met caching van de resultaten te gebruiken, in plaats van de waarde elke keer on-the-fly te berekenen bij elke get.