Sistem de tip comun

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 8 august 2019; verificările necesită 2 modificări .

Common Type System (abreviat CTS, Russian Common Type System ) - parte a .NET Framework , o specificație formală care definește modul în care orice tip (clasă, interfață, structură, tip de date încorporat) trebuie definit pentru ca acesta să fie executat corect de mediu.NET. În plus, acest standard definește modul în care definițiile tipului și valorile tipului special sunt reprezentate în memoria computerului. Scopul dezvoltării CTS a fost de a permite programelor scrise în diferite limbaje de programare să facă schimb de informații cu ușurință. Așa cum este obișnuit în limbajele de programare , un tip poate fi descris ca definind un set de valori valide (cum ar fi „toate numerele întregi de la 0 la 10”) și operații valide pe acele valori (cum ar fi adunarea și scăderea).

Specificația pentru CTS este consacrată în standardul Ecma 335, intitulat „Common Language Infrastructure (CLI) Partitions I to VI . CLI și CTS au fost dezvoltate de Microsoft, iar cadrul Microsoft .NET este o implementare a standardului.

Funcții comune ale sistemului de tip

La rotunjirea valorilor fracționale, cadrul implicit este rotunjirea bancară . Începând cu versiunea  2, „ Rotunjirea aritmetică simetrică ” (rotunjește la cel mai apropiat număr de la zero) este disponibilă și pentru programatori ca caracteristică opțională [1] .

Categorii de tipuri

Sistemul de tip standard acceptă două categorii principale de tipuri:

Tipuri de valori Variabilele tipurilor de valoare conțin direct date, iar instanțele tipurilor de valori sunt situate fie pe stivă, fie direct în corpul altor obiecte. Tipurile de valori pot fi încorporate (implementate de runtime), definite de utilizator sau enumerari. O valoare a unui tip de valoare poate fi convertită într-o valoare a unui tip de referință prin aplicarea unei proceduri de tip boxing. Tipuri de referință Variabilele de tip referință stochează doar o referință la adresa în memorie în care este stocată valoarea (obiectul). Instanțele de tipuri de referință sunt situate pe heap (cu excepția cazului în care este vorba de pointeri). Tipurile de referință sunt împărțite în tipuri de auto-descriere, indicatori și interfețe. Tipul unui tip de referință poate fi dedus din valoarea unui tip auto-descriere. Tipurile de auto-descriere sunt împărțite în matrice și clase. Clasele, la rândul lor, sunt împărțite în clase definite de utilizator, tipuri de valori în casete și delegați.

Următorul exemplu, scris în Visual Basic .NET , demonstrează diferența dintre tipurile de referință și tipurile de valori:

Sistem de import Clasa Clasa1 Valoare publică Ca număr întreg = 0 Clasa finală „ Clasa1 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 . Valoare = 123 Consolă . WriteLine ( „Valori: {0}, {1}” , val1 , val2 ) Consolă . WriteLine ( „Referințe: {0}, {1}” , ref1 . Valoare , ref2 . Valoare ) End Sub „Main End Class ” Test

Exemplul de mai sus produce următoarele:

Valori: 0, 123 Link-uri: 123, 123

Ambalare și despachetare

Ambalare

O valoare a unui tip de valoare poate fi convertită într-o valoare a unui tip de referință prin aplicarea procedurii boxing la aceasta .  În acest caz, valoarea este transferată în heap și este returnată o referință gestionată la zona heap-ului care conține această valoare. După cum puteți vedea din exemplul de mai jos, în C# nu este nevoie să îi spuneți compilatorului să încadreze o valoare Int32, transformându-l astfel într-un obiect, deoarece compilatorul C# însuși detectează această nevoie și inserează codul corespunzător (IL). Totuși, aceasta nu este o capacitate de rulare, ci un comportament al compilatorului. Deci, în limbajul F#, ambalarea este efectuată numai dacă programatorul și-a indicat în mod explicit necesitatea.

Int32 x = 10 ; obiect o = x ; // Consola de box implicit . WriteLine ( "Obiect o = {0}" , o ); // imprimă 10

Cu toate acestea, Int32 poate fi întotdeauna încadrat în mod explicit, după cum se arată mai jos:

Int32 x = 10 ; obiect o = ( obiect ) x ; // Consola de box explicit . WriteLine ( "Obiect o = {0}" , o ); // imprimă 10 Unboxing

Procesul invers de ambalare se numește unboxing .  Următorul exemplu demonstrează cum să despachetați un tip de valoare în casetă anterior în C#.

Int32 x = 5 ; obiect o1 = x ; // Ambalare implicită x = ( int ) o1 ; // Despachetarea explicită

Trebuie remarcat faptul că, în acest exemplu, unboxing necesită o distribuție explicită. Acest lucru se datorează faptului că valoarea în casetă este de tip obiect, în timp ce unboxing necesită un anumit tip. Începând cu C# 4.0, puteți utiliza tipul dinamic în loc de tipul obiectului, ceea ce elimină necesitatea castingului explicit de tip.

dinamic x = 42 ; int y = x ; // Dezambalare implicită

Vezi și

Note

  1. MidpointRounding - enumerare  (rusă)

Link -uri