In VB.NET, a Property is similar to a Function. With a getter and a setter, it controls access to a value. This value is called a backing store.
With Get, a property returns a value. With Set it stores a value. We must have both Get and Set unless we specify ReadOnly
or WriteOnly
on the property.
On the Number property, we provide Get and Set blocks. In Get we return a value—the backing store count. In Set we receive a parameter and then store it in the count field.
Class Example Private _count As Integer Public Property Number() As Integer Get Return _count End Get Set(ByVal value As Integer) _count = value End Set End Property End Class Module Module1 Sub Main() Dim item As Example = New Example() ' Step 1: set property. item.Number = 4 ' Step 2: get property. Console.WriteLine("NUMBER: {0}", item.Number) End Sub End ModuleNUMBER: 4
A property must have both Get and Set members. It is possible to use the ReadOnly
and WriteOnly
keywords to eliminate this requirement.
Module Module1 Property Answer() As Integer Get Return 42 End Get End Property Sub Main() ' Program won't compile. End Sub End ModuleError BC30124 Property without a 'ReadOnly' or 'WriteOnly' specifier must provide both a 'Get' and a 'Set'.
ReadOnly
Some properties are not meant to be assigned. For example, "Count
" on collections is not mutable. The ReadOnly
modifier changes the Property type to have only a Get method.
Count()
property returns a constant Integer. But Get could perform any calculation or return the value of a field.Count
, we get this error: "Property Count
is ReadOnly." So don't do that.Class Example Public ReadOnly Property Count() As Integer Get Return 500 End Get End Property End Class Module Module1 Sub Main() Dim e As Example = New Example() Console.WriteLine(e.Count) End Sub End Module500
WriteOnly
Here we use the WriteOnly
keyword on a property. WriteOnly
means that a Property has only a Set()
method and no Get method. In Main
we create and assign to the Id property.
WriteOnly
properties may be confusing. Often a method is a clearer way to set values.Class Example Dim _id As Integer Public WriteOnly Property Id Set(value) ' Sets the field from an external call. _id = value End Set End Property Public Sub Display() Console.WriteLine(_id) End Sub End Class Module Module1 Sub Main() ' Create Example and assign Id. Dim e As Example = New Example e.Id = 100 e.Display() End Sub End Module100
Auto-implemented properties use a shorter syntax form. With them, we do not specify the Get or Set methods. We just the Property keyword and the declaration statement.
String
property. We make it Public. It contains the name of the Dog objects created.Class Dog Public Property Name As String Public Property Weight As Integer = 10 End Class Module Module1 Sub Main() ' Use automatically-implemented properties. Dim dog As Dog = New Dog() dog.Name = "Old Yeller" dog.Weight = 50 ' Print values. Console.WriteLine(dog.Name) Console.WriteLine(dog.Weight) End Sub End ModuleOld Yeller 50
The automatic property syntax in VB.NET is limited. We cannot use this syntax form if we want to insert code in the getter or setter. We must expand the property to do this.
Properties are not magic. Instead they are implemented in the IL by generated methods. These have the property name prefixed with "get_" or "set_."
Insert
The Visual Studio editor provides some shortcuts for inserting properties. Try typing "pro" and pressing tab twice. Some code for a property will appear.
Properties simplify syntax of VB.NET programs. And they help the language enforce consistency. We avoid writing Get()
and Set()
methods. Instead we use properties.