Common Type System (CTS) är en standard som specificerar hur datatyper ter sig i ett datorminne. Målet är att låta program som är skrivna i olika programspråk lätt ska kunna utbyta information med varandra. I ett programspråk kan en typ beskrivas som en definition av en mängd med värden (till exempel heltal mellan 0 och 10), och de tillåtna operationerna som kan utföras med dessa värden.

Specifikationen för CTS är en del av Ecma standard 335, "Common Language Infrastructure (CLI) Partitions I to VI." CLI och CTS skapades av Microsoft, och Microsoft .NET framework är en implementation av standarden.

Typkategorier redigera

CTS stödjer följande två typer:

Värdetyper

En värdetyp innehåller direkt sitt värde, och allokeras på stacken eller inuti en struktur. Värdetyper kan vara förimplementerade av runtime eller definierade av användaren. De primitiva typerna (int, char, bool osv.) och strukturer är värdetyper.

Referenstyper

En referenstyp innehåller referensen till värdets plats i minnet, och är allokerade på heapen. Variabler är som pekare och är inte bundna till något specifikt objekt. Klasser, gränssnitt, strängar, delegater, boxade värdetyper och arrayer är exempel på referenstyper.

Följande exempel visar skillnaderna mellan värdetyper och referenstyper.

Imports System

Class Class1
    Public Value As Integer = 0
End Class 'Class1
 
Class Test
    Shared Sub Main()
        Dim val1 As Integer = 0
        Dim val2 As Integer = val1
        val2 = 123
        Dim ref1 As New Class1()
        Dim ref2 As Class1 = ref1
        ref2.Value = 123
        Console.WriteLine("Värden: {0}, {1}", val1, val2)
        Console.WriteLine("Referenser: {0}, {1}", ref1.Value, ref2.Value)
    End Sub 'Main
End Class 'Test

Utskriften från exemplet ovan

Värden: 0, 123
Referenser: 123, 123

Boxning redigera

Konvertering av värdetyp till en referenstyp kallas boxning. Detta är möjligt då värdetyper och referenstyper båda ärver basklassen System.Object.

Int32 x = 10; 
object o = x ; // Implicit boxning
Console.WriteLine("The Object o = {0}",o); // skriver ut 10

Men en Int32 kan också bli explicit boxad:

Int32 x = 10; 
object o = (object) x; // Explicit boxning
Console.WriteLine("The object o = {0}",o); // skriver ut 10

På liknande sätt kan den bli konverterad tillbaka till en värdetyp.

Int32 x = 5; 
object o = x; // Implicit boxning
x = o; // Implicit utboxning

Se även redigera

Källor redigera

Externa länkar redigera