Systém běžného typu

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 8. srpna 2019; kontroly vyžadují 2 úpravy .

Common Type System (zkráceně CTS, rusky Common Type System ) – součást .NET Framework , formální specifikace, která definuje, jak musí být definován jakýkoli typ (třída, rozhraní, struktura, vestavěný datový typ), aby byl správně spuštěn. prostředím.NET. Kromě toho tento standard definuje, jak jsou definice typů a hodnoty speciálních typů reprezentovány v paměti počítače. Cílem vývoje CTS bylo umožnit programům napsaným v různých programovacích jazycích snadnou výměnu informací. Jak je běžné v programovacích jazycích , zadejtelze popsat jako definování sady platných hodnot (např. „všechna celá čísla od 0 do 10“) a platných operací s těmito hodnotami (např. sčítání a odčítání).

Specifikace pro CTS je zakotvena ve standardu Ecma 335 s názvem "Common Language Infrastructure (CLI) Partitions I to VI " . CLI a CTS byly vyvinuty společností Microsoft a Microsoft .NET framework je implementací standardu.

Common Type Systémové funkce

Při zaokrouhlování zlomkových hodnot je v rámci výchozího nastavení bankovní zaokrouhlování . Počínaje verzí  2 je programátorům jako volitelná funkce k dispozici také „ Symetrické aritmetické zaokrouhlování “ (zaokrouhluje na nejbližší číslo od nuly) [1] .

Kategorie typů

Standardní typový systém podporuje dvě hlavní kategorie typů:

Typy hodnot Proměnné hodnotových typů přímo obsahují data a instance hodnotových typů jsou umístěny buď na zásobníku nebo přímo v těle jiných objektů. Typy hodnot mohou být vestavěné (implementované běhovým prostředím), uživatelem definované nebo výčty. Hodnotu typu hodnoty lze převést na hodnotu referenčního typu tím, že na ni použijete proceduru v rámečku. Referenční typy Proměnné typu reference ukládají pouze odkaz na adresu v paměti, kde je uložena hodnota (objekt). Instance referenčních typů jsou umístěny na haldě (kromě ukazatelů). Referenční typy se dělí na samopopisující typy, ukazatele a rozhraní. Typ referenčního typu lze odvodit z hodnoty samopopisného typu. Samopopisující typy se dělí na pole a třídy. Třídy se zase dělí na uživatelem definované třídy, krabicové typy hodnot a delegáty.

Následující příklad napsaný ve Visual Basic .NET ukazuje rozdíl mezi typy odkazů a typy hodnot:

Systém importu Class Class1 Public Value As Integer = 0 End Class 'Class1 Třída Test Shared Sub Main () Dim hodnota1 As Integer = 0 Dim ref2 As Integer = hodnota1 hodnota2 = 123 Dim ref1 As New Class1 () Dim ref2 As Class1 = ref1 ref2 . Hodnota = 123 Konzole . WriteLine ( "Hodnoty: {0}, {1}" , hodnota1 , hodnota2 ) Konzole . WriteLine ( "Reference: {0}, {1}" , ref1 . Hodnota , ref2 . Hodnota ) End Sub 'Main End Class 'Test

Z výše uvedeného příkladu vychází následující:

Hodnoty: 0, 123 Odkazy: 123, 123

Balení a vybalování

Balení

Hodnotu hodnotového typu lze převést na hodnotu referenčního typu tím, že na ni použijete postup v rámečku .  V tomto případě se hodnota přenese do haldy a vrátí se spravovaný odkaz na oblast haldy obsahující tuto hodnotu. Jak můžete vidět z níže uvedeného příkladu, v C# není potřeba říkat kompilátoru, aby zaboxoval hodnotu Int32, a tím ji přeměnil na objekt, protože kompilátor C# sám tuto potřebu detekuje a vloží příslušný kód (IL). Nejedná se však o schopnost běhu, ale o chování kompilátoru. Takže v jazyce F# se balení provádí pouze v případě, že programátor výslovně uvedl svou potřebu.

Int32 x = 10 ; objekt o = x ; // Implicitní boxovací konzole . WriteLine ( "Objekt o = {0}" , o ); // vytiskne 10

Int32 však lze vždy explicitně zaškatulkovat, jak je uvedeno níže:

Int32 x = 10 ; objekt o = ( objekt ) x ; // Explicitní boxovací konzole . WriteLine ( "Objekt o = {0}" , o ); // vytiskne 10 Rozbalení

Opačný proces balení se nazývá unboxing .  Následující příklad ukazuje, jak rozbalit dříve zabalený typ hodnoty v C#.

Int32 x = 5 ; objekt o1 = x ; // Implicitní balení x = ( int ) o1 ; // Explicitní rozbalení

Je třeba poznamenat, že v tomto příkladu vyžaduje rozbalení explicitní obsazení. Je to proto, že hodnota v rámečku je typu objekt, zatímco rozbalení vyžaduje specifický typ. Počínaje C# 4.0 můžete místo typu objektu použít dynamický typ, což eliminuje potřebu explicitního přetypování.

dynamické x = 42 ; int y = x ; // Implicitní rozbalení

Viz také

Poznámky

  1. MidpointRounding – výčet  (ruština)

Odkazy