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.1. Value en Reference Types Inleiding

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.

Tot nu toe hebben we steeds met variabelen gewerkt die gedeclareerd zijn van een ingebouwde datatypes (Byte, Short, Integer, Long, Single, Double, Char, String, Boolean, Date, Array, ...) of van user-defined types (Person, Persons, Student, Students, ...).

We kunnen deze types ook in twee andere categorieën gaan opdelen.  Namelijk value types (Byte, Short, Integer, Long, Single, Double, Char, Boolean, Date, ...) die gedefinieerd zijn aan de hand van een structure (Structure ... End Structure) en referencetypes (String, Array, Person, Persons, Student, Students, ...) die gedefinieerd worden aan de hand van een class (Class ... End Class).

Een belangrijk verschil bij het aanmaken van een instantie van beide types is dat bij het maken van instantie van een referencetype men expliciet een objectinitializer nodig heeft (bv : New Person).
In tegenstelling hiermee, wordt bij het declareren van een variabele van een value type automatisch een instantie aan die variabele gekoppeld.

Aan elke variabele van een value type is dus een instantie gekoppeld, dit is altijd niet zo voor variabelen van een referencetype.  Deze kunnen ook Nothing (Null in .NET terminologie) bevatten (wat ook de default inhoud is van een referencetype variabele na declaratie).
Visual Basic 2012 Broncode - Codevoorbeeld 344
Option Strict Off
Class Counter
    Public Property Value As Integer
    Public Overrides Function ToString() As String
        ToString = Value.ToString()
    End Function
End Class
Class Example1
    Public Shared Sub Main()
        Dim valueType1 As Integer = 1
        Dim valueType2 As Integer = 2
        Console.WriteLine("valueType1 : " & valueType1)
        Console.WriteLine("valueType2 : " & valueType2)
        valueType1 = valueType2                                             ' (1)
        Console.WriteLine("valueType1 : " & valueType1)
        Console.WriteLine("valueType2 : " & valueType2)
        valueType1 = 3
        Console.WriteLine("valueType1 : " & valueType1)
        Console.WriteLine("valueType2 : " & valueType2)
        '
        Dim referenceType1 As Counter = New Counter With {.Value = 1}
        Dim referenceType2 As Counter = New Counter With {.Value = 2}
        Console.WriteLine("referenceType1 Value : " & referenceType1.Value)
        Console.WriteLine("referenceType2 Value : " & referenceType2.Value)
        referenceType1 = referenceType2                                     ' (2)
        Console.WriteLine("referenceType1 Value : " & referenceType1.Value)
        Console.WriteLine("referenceType2 Value : " & referenceType2.Value)
        referenceType1.Value = 3
        Console.WriteLine("referenceType1 Value : " & referenceType1.Value)
        Console.WriteLine("referenceType2 Value : " & referenceType2.Value)
        referenceType2 = New Counter With {.Value = 4}
        Console.WriteLine("referenceType1 Value : " & referenceType1.Value)
        Console.WriteLine("referenceType2 Value : " & referenceType2.Value)
        '
        Console.ReadLine()
    End Sub
End Class
Console Application Output
valueType1 : 1
valueType2 : 2
valueType1 : 2
valueType2 : 2
valueType1 : 3
valueType2 : 2
referenceType1 Value : 1
referenceType2 Value : 2
referenceType1 Value : 2
referenceType2 Value : 2
referenceType1 Value : 3
referenceType2 Value : 3
referenceType1 Value : 3
referenceType2 Value : 4
Zoals je in bovenstaand voorbeeld kunt merken zal bij het toekennen van de inhoud van één value type variabele aan een andere value type variabele er steeds een kopie worden gemaakt van die inhoud om aan de ge-assigneerde variabele te kunnen koppelen.
Op regel (1) wordt een kopie van de Integer instantie uit variabele valueType2 met waarde 2 gekoppeld aan de variabele valueType1.

Eigenlijk gebeurt hetzelfde bij toekenningen aan referencetype variabelen, ook daar zal een kopie ("shallow copy") van de inhoud worden gekoppeld aan de ge-assigneerde variabele.
Alleen is het verschil dat de inhoud van een variabele een reference (verwijzing naar een object) is, en dat dus de reference (of Nothing) zal gekopieerd worden in tegenstelling tot het object zelf.
Op regel (2) wordt de referentie naar Counter object met Value 2 gekopieerd naar de variabele referenceType1.  Beide variabelen wijzen nu  naar hetzelfde object.

Voordeel van referencetypes is dus op zen minst dat bij het kopiëren slechts de referentie wordt gekopieerd en bijgevolg ook dat zo meerdere referencetype variabelen naar hetzelfde object kunnen wijzen.

De nodige opslagruimte speelt in het nadeel bij referencetype variabelen.
Voor de opslag van één Integer instantie (in variabele valueType1 bijvoorbeeld) is ruwweg 4 bytes geheugenruimte nodig.
Voor de opslag van één object (referencetype instantie) is ruwweg de som van alle opslagruimtes voor de velden nodig plus 4 bytes om de referentie te bewaren.  Voor een objectreferentie is steeds 4 bytes nodig (4 bytes op 32-bit platform, 8 bytes op 64-bit platform).
In dit voorbeeld is er dus ruwweg 8 bytes nodig om een Counter object te bewaren.

13.1.1. By Val en By Ref Werken met Doorgegeven Argumentwaarden

Als je referencetypes hebt, is het by reference werken met doorgegeven argumentwaarden eigenlijk overbodig.

In plaats van een value type variabele te gebruiken bij een aanroep naar een method met een ByRef argument, kan men ook een referencetype variabele gebruiken bij het doorgeven aan een method met een ByVal argument.
Visual Basic 2012 Broncode - Codevoorbeeld 345
Class Example2
    Public Shared Sub Main()
        Dim value1 As Integer = 5
        MultiplyBy10(value1)
        Console.WriteLine(value1)
        '
        Dim value2 As New Counter With {.Value = 10}
        MultiplyBy10(value2)
        Console.WriteLine(value2.Value)
        '
        Console.ReadLine()
    End Sub
    Public Shared Sub MultiplyBy10(ByRef value As Integer)
        value *= 2
    End Sub
    Public Shared Sub MultiplyBy10(ByVal value As Counter)
        value.Value *= 2
    End Sub
End Class
Console Application Output
10
20

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