Reading — step 1 of 5
Learn
~2 min readModules, Generics, Async
VB.NET supports full .NET generics — same engine as C# generics.
Generic class
Class Box(Of T)
Public Property Value As T
Public Sub New(v As T)
Value = v
End Sub
End Class
' Usage:
Dim intBox = New Box(Of Integer)(42)
Dim strBox = New Box(Of String)("hello")
intBox.Value ' 42
strBox.Value ' "hello"
The (Of T) is the type parameter list. Multiple: (Of K, V).
Generic function
Function Max(Of T As IComparable)(a As T, b As T) As T
If a.CompareTo(b) > 0 Then
Return a
Else
Return b
End If
End Function
Dim m1 = Max(3, 7) ' inferred — 7
Dim m2 = Max("abc", "xyz") ' "xyz"
As IComparable is a constraint — T must implement IComparable.
Constraint types
As ClassName— must inherit from this classAs IName— must implement this interfaceAs Class— must be a reference typeAs Structure— must be a value typeAs New— must have a parameterless constructor
Function Create(Of T As New)() As T
Return New T()
End Function
Generic collections
The whole System.Collections.Generic namespace:
List(Of T)— dynamic arrayDictionary(Of K, V)— hash mapHashSet(Of T)— hash setQueue(Of T),Stack(Of T)LinkedList(Of T)SortedDictionary(Of K, V),SortedSet(Of T)
Dim users As New List(Of String)
users.Add("Ada")
users.Add("Bob")
Dim ages As New Dictionary(Of String, Integer)
ages.Add("Ada", 36)
ages("Bob") = 25
Dim unique As New HashSet(Of Integer)({1, 2, 3, 2, 1})
unique.Count ' 3
Generic interfaces
Interface IComparable(Of T)
Function CompareTo(other As T) As Integer
End Interface
Class Person
Implements IComparable(Of Person)
Public Property Age As Integer
Public Function CompareTo(other As Person) As Integer Implements IComparable(Of Person).CompareTo
Return Me.Age.CompareTo(other.Age)
End Function
End Class
Allows type-safe Comparable, Equatable, etc.
Default(Of T)
Retrieve the default value for type T:
Function Empty(Of T)() As T
Return Nothing ' or CType(Nothing, T)
End Function
Default(Of Integer) ' 0
Default(Of String) ' Nothing
Why generics over Object
- Type safety: compile-time errors instead of runtime InvalidCastException
- Performance: no boxing/unboxing for value types
- IntelliSense: IDE knows the actual type
Discussion
Ask a question, share an insight, or help someone who’s stuck.
Sign in to post a comment or reply.
Loading…