Visual Basic 2012 Voorbeelden
   

visual basic 2012 broncode voorbeelden

Blijf op de hoogte van de recente aanpassingen op vbvoorbeelden!

Microsoft Visual Studio 2012Microsoft Developers Network - Visual BasicMicrosoft .NET Framework

13.2. Object en ValueType, Boxing en Unboxing

Print Email Deel op Twitter Deel op Facebook

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.

13.2.1. System.Object en System.ValueType

Elk type dat in de .NET runtime bruikbaar is moet een type zijn dat afgeleid is van het type System.Object.
Een value type is een type dat overerft van System.ValueType, wat opzich weer een afgeleide is van System.Object.

De runtime gaat anders om met instanties van value en reference types.  Value type instanties worden op de "stack" ge-alloceerd, reference type instanties worden op de "heap" ge-alloceerd.
Het alloceren of ophalen van data uit de stack gaat iets vlugger, alhoewel dit sterk afhankelijk is van het aantal instanties en het gebruikte platform.  Dit opzicht zou men als een voordeel van value type kunnen beschouwen.

Om het type-systeem wat robuuster/flexibeler te maken heeft men ervoor gezorgd dat men value type waarden kan stockeren in een variabele/instantie van het referencetype System.Object zonder dat men expliciet dergelijke Object instantie moet gaan aanmaken (met bijvoorbeeld New Object).

13.2.2. Boxing en Unboxing

Wanneer een value type waarde wordt toegekend aan een objectvariabele dan blijft het zo dat deze objectvariabele een referentie zal bevatten van een object.  Wat gebeurt is dat de toegekende waarde in een object wordt gestockeerd ("boxing" (1)) en dat de referentie van dat geboxte object dan wordt toegekend aan die Object variabele.  Bijkomend wordt in dat object het type gemarkeerd van de inhoud.  Dit om ervoor te zorgen dat als de Object variabele vervolgens gebruikt wordt, men weet hoe men van dat geboxte object weer moet overgaan naar een waarde van dat gemarkeerde type ( "unboxing" (2)).
Visual Basic 2012 Broncode - Codevoorbeeld 346
Class Person
    Public Property Name As String
    Public Overrides Function ToString() As String
        ToString = Name
    End Function
End Class
Class Example1
    Public Shared Sub Main()
        Dim object1 As Object = 1                                          ' (1)
        Console.WriteLine(object1 + 2)                                     ' (2)
        '
        Dim object2 As Object = "abc"
        Console.WriteLine(object2 & "def")
        '
        Dim object3 As Object = New Person With {.Name = "John"}
        Console.WriteLine(object3)
        '
        Dim object4 As Object = New Counter With {.Value = 4}
        Console.WriteLine(object4)
        '
        Console.ReadLine()
    End Sub
End Class
Console Application Output
3
abcdef
John
4
Zoals je merkt kan alles in een Object variabele stockeren.
In bovenstaande Client wordt zowel een Integer, String, Person als Counter waarde in een Object variabele gedeponeerd.
Wat uiteraard erg handig is, bijvoorbeeld in situaties waar men een collectie zou willen beheren van elementen van verschillende datatypes.  In dergelijke gevallen kan men als datatype voor de elementen gewoon het System.Object datatype gaan gebruiken.

Boxing treedt op bij het toekennen van een value type waarde aan een variabele van het type System.Object.

Wees u ervan bewust dat assignaties in verschillende vormen kunnen bestaan.
Visual Basic 2012 Broncode - Codevoorbeeld 347
Class Example2
    Public Shared Sub Main()
        Dim operand1 As Object = 1                                         ' (1)
        Dim operand2 As Integer = 2
        '
        Console.WriteLine(GetSum(operand1, operand2))                      ' (2)
        '
        Console.ReadLine()
    End Sub
    Public Shared Function GetSum(ByVal operand1 As Object, _
                                  ByVal operand2 As Object) As Object
        Return operand1 + operand2                                         ' (3)
        ' or :
        ' GetSum = operand1 + operand2                                     ' (3)
    End Function
End Class
Console Application Output
3
Drie verschillende vormen van assignaties kunnen in bovenstaand voorbeeld onderscheiden worden :
- de gewone toekenning (<linkerdeel> = <rechterdeel>) (1)
- het doorgeven van een parameterwaarde (2)
- het instellen van de terugkeerwaarde van een functie (3)

Drie maal boxing is hier dus ook het geval.

Uit vorig voorbeeld zou je kunnen concluderen om enkel nog variabelen te declareren van het Object datatype en enkel nog Object als returntype voor functies te definiëren.  Waarom zou je je immers nog bezighouden met de specifieke datatypes als toch alles kan gebeuren via het Object datatype ?

Het belangrijkste argument om alvast toch steeds zo specifiek mogelijke datatypes te gaan uitkiezen ("strong typing") is performantie/optimalisatie van uw code.

Boxing en unboxing operaties bijvoorbeeld nemen zowel tijd als ruimte in beslag, zoals ook in onderstaand voorbeeld wordt gedemonstreerd.
Visual Basic 2012 Broncode - Codevoorbeeld 348
Class Example3
    Public Shared Sub Main()
        Dim start, done As Integer
        '
        Dim value1 As Integer
        Dim value2 As Integer
        start = System.Environment.TickCount
        For teller As Integer = 1 To 10000000
            value1 = 5
            value2 = value1
        Next
        done = System.Environment.TickCount
        Console.WriteLine("TickCount : " & done - start)
        '
        Dim value3 As Object
        start = System.Environment.TickCount
        For teller As Integer = 1 To 10000000
            value3 = 5                                                     ' (1)
            value2 = value3                                                ' (2)
        Next
        done = System.Environment.TickCount
        Console.WriteLine("TickCount : " & done - start)
        '
        Console.ReadLine()
    End Sub
End Class
Dit voorbeeld zou bijvoorbeeld volgende output kunnen geven :
Console Application Output
TickCount : 16
TickCount : 281
Dit voorbeeld is een kleine test naar de verschillen in performantie tussen het al dan niet boxen en unboxen.  De test is niet volledig exact in de zin dat de testresultaten sterk beïnvloedbaar zijn door externe omstandigheden, maar deze test blijft ons enkele significante resultaten opleveren.

De TickCount member uit de Environment klasse levert het aantal milliseconden op dat het systeem reeds is opgestart.

Zoals in bovenstaand voorbeeld te merken is nemen deze boxing (1) en unboxing (2) operaties een bepaalde tijd in beslag.  Niet alleen tijd, maar natuurlijk ook nog eens een bepaalde opslagruimte.  De conclusie is dat zowel voor ruimte als voor tijd dit niet interessant is.

Lees de volgende topics voor meer details over de verschillen tussen value en referencetypes.

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.