|
Dit artikel is gepubliceerd op zondag 31 juli 2011 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 2010 Broncode Option Strict OffClass Counter Private m_Value As Integer Public Property Value() As Integer Get Value = m_Value End Get Set( ByVal value As Integer) m_Value = value End Set End Property Public Overrides Function ToString() As String ToString = Value.ToString() End FunctionEnd ClassClass 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 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 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 SubEnd ClassDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
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 ArgumentwaardenAls 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 2010 Broncode 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 SubEnd ClassDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output 10
20
Dit artikel is gepubliceerd op zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
|