Algoritmy a programování III

Týden 3

Deklarace typů

Programy v jazyce C# používají deklarace typů k vytváření nových typů. Deklarace typu Určuje název a členy nového typu. Šest kategorií typů v jazyce C# je uživatelsky definované: typy tříd, typy struktury, typy rozhraní, typy výčtu, typy delegátů a typy hodnot řazené kolekce členů. Můžete také deklarovat record typy, buď record struct nebo record class . Typy záznamů mají členy syntetizované kompilátorem. Záznamy slouží hlavně pro ukládání hodnot s minimálním přidruženým chováním.

  • classTyp definuje datovou strukturu obsahující datové členy (pole) a členy funkce (metody, vlastnosti a další). Typy tříd podporují jednu dědičnost a polymorfismus, mechanismy, které mohou odvozené třídy roztáhnout a specializovat základní třídy.
  • structTyp je podobný typu třídy v tom, že představuje strukturu s datovými členy a členy funkce. Nicméně na rozdíl od tříd, struktury jsou typy hodnot a obvykle nevyžadují přidělení haldy. Typy struktury nepodporují uživatelem zadanou dědičnost a všechny typy struktury implicitně dědí z typu object .
  • interfaceTyp definuje kontrakt jako pojmenovanou sadu veřejných členů. classNebo struct , který implementuje interface , musí poskytnout implementace členů rozhraní. interfaceMůže dědit z více základních rozhraní a class nebo struct může implementovat více rozhraní.
  • delegateTyp představuje odkazy na metody s konkrétním seznamem parametrů a návratovým typem. Delegáti umožňují zacházet s metodami jako s entitami, které lze přiřadit proměnným a předávat jako parametry. Delegáti jsou analogické jako typy funkcí poskytované funkčními jazyky. Jsou také podobné konceptu ukazatelů funkcí nalezených v některých jiných jazycích. Na rozdíl od ukazatelů na funkce jsou delegáti objektově orientovaný a typově bezpečný.

classTypy, struct , interface a delegate podporují obecné typy, na jejichž základě lze parametry používat s jinými typy.

Jazyk C# podporuje jednorozměrné a multidimenzionální pole libovolného typu. Na rozdíl od typů uvedených výše nemusí být typy polí deklarovány dříve, než mohou být použity. Místo toho jsou typy polí konstruovány pomocí názvu typu s hranatými závorkami. Například int[] je int jednorozměrné pole, int[,] je dvourozměrné pole int , a int[][] je jednorozměrné pole jednorozměrného pole nebo "vícenásobné" pole z int ...

Typy s možnou hodnotou null nevyžadují samostatnou definici. Pro každý typ T , který nepovoluje hodnotu null, existuje odpovídající typ T? s možnou hodnotou null, který může obsahovat další hodnotu, null . int?Například je typ, který může obsahovat libovolné 32 celé číslo nebo hodnotu null a string? je typ, který může obsahovat libovolnou string hodnotu null nebo.

Systém typů jazyka C# je sjednocením, aby hodnota libovolného typu mohla být považována object za. Každý typ v jazyce C# přímo nebo nepřímo je odvozen z object typu třídy a object je nejvyšší základní třídou všech typů. Hodnoty typů odkazů se považují za objekty pouhým zobrazením hodnot jako typu object . Hodnoty typů hodnot se považují za objekty prováděním operací zabalení a rozbalení. V následujícím příkladu int je hodnota převedena na object a zpět na int .


int i = 123;
object o = i;    // Boxing
int j = (int)o;  // Unboxing

Při přiřazení hodnoty typu hodnoty k object odkazu je "pole" přiděleno pro uchování hodnoty. Toto pole je instancí typu odkazu a hodnota je zkopírována do tohoto pole. Naopak, pokud object je odkaz přetypování na typ hodnoty, je provedena kontrolu, že odkazovaná object je pole správného typu hodnoty. Pokud je ověření úspěšné, je hodnota v poli zkopírována na typ hodnoty.

Sjednocený Typový systém v jazyce C# znamená, že typy hodnot jsou považovány object za odkazy na vyžádání. Z důvodu sjednocení, knihovny pro obecné účely, které používají typ object , lze použít se všemi typy odvozenými z object , včetně typů odkazů a typů hodnot.

V jazyce C# existuje několik druhů proměnných , včetně polí, prvků pole, místních proměnných a parametrů. Proměnné reprezentují umístění úložiště. Každá proměnná má typ, který určuje, jaké hodnoty mohou být uloženy v proměnné, jak je znázorněno níže.

  • Typ hodnoty, která není null
    • Hodnota, která má přesný typ
  • Typ hodnoty s možnou hodnotou null
    • nullHodnota nebo hodnota daného přesného typu
  • object
    • nullOdkaz, odkaz na objekt libovolného typu odkazu, nebo odkaz na zabalenou hodnotu libovolného typu hodnoty
  • Typ třídy
    • nullOdkaz, odkaz na instanci tohoto typu třídy nebo odkaz na instanci třídy odvozené z tohoto typu třídy
  • Typ rozhraní
    • nullOdkaz, odkaz na instanci typu třídy, která implementuje tento typ rozhraní, nebo odkaz na zabalenou hodnotu typu hodnoty, který implementuje tento typ rozhraní
  • Typ pole
    • nullOdkaz, odkaz na instanci tohoto typu pole nebo odkaz na instanci kompatibilního typu pole
  • Typ delegáta
    • nullOdkaz nebo odkaz na instanci kompatibilního typu delegáta