Property in Visual Basic is used to encapsulate access to an object's data with the ability to perform checks, computations, and manage access control. Properties contain Get blocks (for reading values) and Set blocks (for setting values).
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("Age must be between 0 and 120!") End If _age = value End Set End Property
With such a property, you can implement value validation, caching, on-the-fly computation, etc., and for the user, the object appears to be a regular field.
Public Property ItemId As Integer ' automatically creates a hidden field, no access to logic
Nuance: automatic properties cannot be extended with internal logic without explicit declaration of get/set.
Question: Can a property in Visual Basic be implemented with only a public set and a private get? How can different access levels be set for get and set?
Answer: Yes, starting from VB.NET, you can specify different access levels for get and set:
Public Property Salary As Decimal Private Get Return _salary End Get Set(ByVal value As Decimal) _salary = value End Set End Property
In this example, only the class can get the value of Salary, while external objects can only set it.
Story
A developer used automatic properties for all fields of a business object. Later, validation for negative values became necessary, but switching from an automatic property to an explicit one required manually adjusting a large part of the code, leading to errors and increased workload.
Story
During the migration from VB6 to VB.NET, some properties were implemented as fields with public access modifiers: this opened full unauthorized access to the internal data of the class, leading to unwanted modifications of the state by external objects.
Story
In a complex object, a property contained additional computations in the get block, including file operations. When the property was accessed frequently, the application's performance dropped sharply; it turned out that using a private field with cached results would have been better than computing the value on-the-fly during each get.