In Visual Basic kan een eigenschap (Property) op twee manieren worden gedeclareerd:
' Automatische eigenschap Public Property Name As String ' Volledige eigenschap Private _age As Integer Public Property Age As Integer Get Return _age End Get Set(value As Integer) If value < 0 Then Throw New ArgumentException("Leeftijd kan niet negatief zijn") _age = value End Set End Property
Nuances bij het gebruik van Set:
Value is een pseudovariabele die verwijst naar de toegewezen waarde.Set kan validatie, logging, en het starten van evenementen worden uitgevoerd.**Wanneer te gebruiken: **
Wat zijn de gevaren van de fout bij het schrijven van
Set(ByVal value As Integer)in plaats vanSet(value As Integer)in VB.NET? Waarom zou je dat niet moeten schrijven?
Antwoord:
De syntaxis van VB.NET vereist (en ondersteunt niet) de expliciete verklaring van de parameter ByVal in Set — gebruik gewoon Set(value As Type). Als je Set(ByVal value As Integer) schrijft, leidt dit tot een compilatiefout.
Voorbeeld van foutieve code:
'Set(ByVal value As Integer) — compilatiefout Public Property Prop As Integer Set(ByVal value As Integer) ... End Set End Property
In klassiek VB6 was deze syntaxis toegestaan, maar in VB.NET is het strikt vereist Set(value As Type).
Geschiedenis
ByVal in Set geplaatst — de compiler gaf mysterieuze fouten die moeilijk te lokaliseren waren, omdat de linter geen duidelijke oorzaak toonde.Geschiedenis
Geschiedenis
Bij het kopiëren van objecten van referentietype via automatische eigenschappen vergaten we deep copy via Get/Set te implementeren. Het resultaat was duplicatie van verwijzingen naar hetzelfde object; wijzigingen in het ene exemplaar leidden tot wijzigingen in het andere.