Common Type System (förkortat CTS, Russian Common Type System ) - en del av .NET Framework , en formell specifikation som definierar hur vilken typ som helst (klass, gränssnitt, struktur, inbyggd datatyp) måste definieras för att den ska exekveras korrekt av miljön.NET. Dessutom definierar denna standard hur typdefinitioner och speciella typvärden representeras i datorns minne. Målet med att utveckla CTS var att göra det möjligt för program skrivna på olika programmeringsspråk att enkelt utbyta information. Som är vanligt i programmeringsspråk kan en typ beskrivas som att definiera en uppsättning giltiga värden (som "alla heltal från 0 till 10") och giltiga operationer på dessa värden (som addition och subtraktion).
Specifikationen för CTS är inskriven i Ecma 335-standarden, med titeln "Common Language Infrastructure (CLI) Partitions I to VI " . CLI och CTS har utvecklats av Microsoft och Microsoft .NET-ramverket är en implementering av standarden.
Vid avrundning av bråkvärden används ramverket som standard till bankavrundning . Från och med version 2 är " Symmetrisk aritmetisk avrundning " (avrundar till närmaste tal från noll) också tillgänglig för programmerare som en valfri funktion [1] .
Standardtypsystemet stöder två huvudkategorier av typer:
Värdetyper Variabler av värdetyper innehåller direkt data, och instanser av värdetyper finns antingen i stacken eller direkt i kroppen av andra objekt. Värdetyper kan vara inbyggda (implementerade av körtiden), användardefinierade eller uppräkningar. Ett värde av en värdetyp kan konverteras till ett värde av en referenstyp genom att tillämpa en boxningsprocedur på det. Referenstyper Variabler av referenstyp lagrar endast en referens till adressen i minnet där värdet (objektet) är lagrat. Förekomster av referenstyper finns på högen (förutom när det gäller pekare). Referenstyper är indelade i självbeskrivande typer, pekare och gränssnitt. Typen av en referenstyp kan härledas från värdet av en självbeskrivande typ. Självbeskrivande typer är indelade i arrayer och klasser. Klasser är i sin tur uppdelade i användardefinierade klasser, boxade värdetyper och delegater.Följande exempel, skrivet i Visual Basic .NET , visar skillnaden mellan referenstyper och värdetyper:
Importsystem _ Klass Klass1 Offentligt värde som heltal = 0 Slutklass ' Klass1 Klass Test Delad Sub Main () Dim val1 Som heltal = 0 Dim val2 Som heltal = val1 val2 = 123 Dim ref1 Som ny klass1 () Dim ref2 As Class1 = ref1 ref2 . Värde = 123 Konsol . WriteLine ( "Värden: {0}, {1}" , val1 , val2 ) Konsol . WriteLine ( "Referenser: {0}, {1}" , ref1 . Värde , ref2 . Värde ) End Sub 'Main End Class ' TestExemplet ovan ger ut följande:
Värden: 0, 123 Länkar: 123, 123Ett värde av en värdetyp kan konverteras till ett värde av en referenstyp genom att tillämpa boxningsproceduren på det . I det här fallet överförs värdet till högen, och en hanterad referens till området för högen som innehåller detta värde returneras. Som du kan se från exemplet nedan, i C# finns det inget behov av att säga åt kompilatorn att boxa ett Int32-värde, och därmed förvandla det till ett objekt, eftersom C#-kompilatorn själv upptäcker detta behov och infogar lämplig kod (IL). Detta är dock inte en runtime-funktion, utan ett kompilatorbeteende. Så i F#-språket utförs paketering endast om programmeraren uttryckligen har angett sitt behov.
Int32 x = 10 ; objekt o = x ; // Implicit boxningskonsol . WriteLine ( "Objekt o = {0}" , o ); // skriver ut 10Int32 kan dock alltid vara explicit inramad, som visas nedan:
Int32 x = 10 ; objekt o = ( objekt ) x ; // Explicit boxningskonsol . WriteLine ( "Objekt o = {0}" , o ); // skriver ut 10 UnboxingDen omvända processen med förpackning kallas uppackning . Följande exempel visar hur man packar upp en tidigare boxad värdetyp i C#.
Int32 x = 5 ; objekt o1 = x ; // Implicit packning x = ( int ) o1 ; // Explicit uppackningDet bör noteras att i det här exemplet kräver unboxning en explicit rollbesättning. Detta beror på att det inramade värdet är av typen objekt, medan uppackning kräver en specifik typ. Från och med C# 4.0 kan du använda den dynamiska typen istället för objekttypen, vilket eliminerar behovet av explicit typcasting.
dynamisk x = 42 ; int y = x ; // Implicit uppackning.NETTO | |
---|---|
Genomföranden | |
Arkitektur | |
Infrastruktur | |
Microsofts språk | |
Andra språk | |
Windows Foundations | |
Komponenter | |
Jämförelser |
|
Framtida teknologier | |
Informationsresurser |