Vanliga typsystem

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 8 augusti 2019; kontroller kräver 2 redigeringar .

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.

Common Type Systemfunktioner

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] .

Kategorier av typer

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 ' Test

Exemplet ovan ger ut följande:

Värden: 0, 123 Länkar: 123, 123

Packa och packa upp

Förpackning

Ett 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 10

Int32 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 Unboxing

Den 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 uppackning

Det 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

Se även

Anteckningar

  1. MidpointRounding - uppräkning  (ryska)

Länkar