Sdílet prostřednictvím


Typy (Příručka programování C#)

Typy, proměnné a hodnoty

C# je jazyk se silnými.Všechny proměnné a konstanty má typ, stejně jako každý výraz, který je vyhodnocován na hodnotu.Každý podpis metody Určuje typ pro každé vstupní parametr a vrácené hodnoty.Na.NET Framework, knihovna tříd definuje sadu předdefinovaných číselných typů, jakož i složitější typy, které představují širokou škálu logických konstrukcí, například systému souborů, síťová připojení, kolekce a pole objektů a data.Typický program C# používá typy z knihovny tříd, jakož i uživatelem definované typy, které model koncepty, které jsou specifické pro doménu programu problém.

Informace uložené v typu patří:

  • Úložný prostor, který vyžaduje proměnné typu.

  • Maximální a minimální hodnoty, které mohou představovat.

  • Členy (metody, polí, události a podobně), které obsahuje.

  • Základní typ, který dědí z.

  • Umístění, kde bude přiděleno paměti pro proměnné v době spuštění.

  • Druhy operací, které jsou povoleny.

Kompilátor používá typ informace zkontrolujte, že všechny operace, které jsou provedeny v kódu typu bezpečné.Pokud deklarujete proměnnou typu int, kompilátor umožňuje také použít proměnnou a operace odčítání.Pokud se pokusíte provést tyto stejné operace na proměnnou typu bool, kompilátor vygeneruje chybu, jak ukazuje následující příklad:

int a = 5;             
int b = a + 2; //OK

bool test = true;

// Error. Operator '+' cannot be applied to operands of type 'int' and 'bool'.
int c = a + test;

[!POZNÁMKA]

C a C++ vývojáři si v jazyce C# bool není převoditelná na int.

Kompilátor vloží informace o typu do spustitelného souboru jako metadata.Společný jazykový modul runtime (CLR) používá že metadata v době spuštění dále zaručit bezpečnost typů přiděluje a uvolňuje volné paměti.

ms173104.collapse_all(cs-cz,VS.110).gifUrčení typů v deklarace proměnných

Při deklarování proměnné nebo konstanty v programu, musíte zadat jeho typ nebo použít var klíčové slovo, aby kompilátor odvození typu.Následující příklad ukazuje některé deklarace proměnných, které použít předdefinované číselné typy a komplexní typy definované uživatelem:

// Declaration only:
float temperature;
string name;
MyClass myClass;

// Declaration with initializers (four examples):
char firstLetter = 'C';
var limit = 3;
int[] source = { 0, 1, 2, 3, 4, 5 };
var query = from item in source
            where item <= limit
            select item;

Typy parametrů metody a vrácené hodnoty jsou uvedeny v podpis metody.Zobrazuje následující metodu, která vyžaduje int jako vstupní argument a vrátí řetězec:

public string GetName(int ID)
{
    if (ID < names.Length)
        return names[ID];
    else
        return String.Empty;
}
private string[] names = { "Spencer", "Sally", "Doug" };

Po je proměnná deklarována, nemůže být re-declared s novým typem a ji nelze přiřadit hodnotu, která není kompatibilní s jeho deklarovaný typ.Například nelze deklarovat int a přiřaďte booleovskou hodnotu true.Hodnoty však lze převést na jiné typy, například když jsou přiřazena nové proměnné nebo předány jako argumenty metody.A převodu typu že nepodporuje, způsobit ztrátu dat je prováděno automaticky pomocí kompilátoru.Vyžaduje převod, který může způsobit ztrátu dat cast ve zdrojovém kódu.

Další informace naleznete v tématu Obsazení a převody typu (Příručka programování C#).

Předdefinované typy

C# obsahuje standardní sadu předdefinovaných číselných typů představující celá čísla, plovoucí bodu hodnoty, logické výrazy, znaky textu, desetinné hodnoty a jiných typů dat.Existují také vestavěné string a object typy.Jsou k dispozici pro použití v libovolné aplikaci C#.Další informace o předdefinované typy, viz Referenční tabulky pro typy (C#-Reference).

Vlastní typy

Použití struct, třídy, rozhraní, a výčtu konstrukce a vytvořit vlastní typy.Na.NET Framework sám je kolekce vlastních typů poskytované společností Microsoft, který můžete použít ve svých vlastních aplikacích.Nejčastěji používané typy v knihovně třídy jsou ve výchozím nastavení k dispozici v libovolné aplikaci C#.Jiné jsou k dispozici pouze v případě, že explicitně přidejte do projektu odkaz na sestavení, ve kterém jsou definovány.Odkaz na sestavení po kompilátoru můžete deklarovat proměnné (a konstanty) typů deklarovat v tomto shromáždění ve zdrojovém kódu.Další informace naleznete v .NET Framework, knihovna tříd.

Common Type System

Je důležité porozumět dvou základních bodů o typu systému .NET Framework:

  • Podporuje zásadu dědičnosti.Typy lze odvodit z jiných typů, se nazývá základní typy.Odvozený typ zdědí (s určitými omezeními) metod, vlastností a ostatní členové základního typu.Základní typ můžete zase odvodit z některé jiné typy, ve kterém případě odvozený typ zdědí členové obou základních typů v hierarchii dědičnosti.Všech typů, včetně předdefinované číselné typy jako System.Int32 (klíčové slovo jazyka C#: int), odvodit nakonec od jednoho základního typu, který je System.Object (klíčové slovo jazyka C#: objektu).Tento jednotný typ hierarchie se nazývá Specifikace CTS (Common Type System) (CTS).Další informace o dědičnosti v jazyce C#, viz Dědičnost (Příručka programování C#).

  • Každý typ v CTS je definována jako Typ hodnoty nebo Typ odkazu.To zahrnuje všechny vlastní typy v.NET Framework, knihovna tříd a také uživatelem definované typy.Typy, které definují pomocí struct jsou typy hodnot; předdefinované číselné typy jsou structs.Typy, které definují pomocí třídy jsou referenční typy.Referenční typy a hodnoty mají různá pravidla pro kompilaci a odlišné chování Runtime.

Následující obrázek znázorňuje vztah mezi typy hodnoty a typy odkazů v CTS.

Hodnota typů a referenční typy v CTS

Hodnoty a odkazové typy

[!POZNÁMKA]

Uvidíte, že běžně používané typy jsou všechny uspořádány v System oboru názvů.Obor názvů, ve kterém je obsažen typ má však žádný vztah k, zda je hodnota typu nebo typ odkazu.

ms173104.collapse_all(cs-cz,VS.110).gifTypy hodnot

Typy hodnoty se odvozují z System.ValueType, který je odvozen z System.Object.Typy, které pocházejí z System.ValueType mají zvláštní chování v CLR.Hodnota proměnné typu obsahovat přímo jejich hodnoty, což znamená, že je paměť přidělená vložené v jakémkoli kontextu je proměnná deklarována.Neexistuje přidělení haldy samostatné nebo režie sběr odpadků pro proměnné typu hodnoty.

Existují dvě kategorie typů hodnot: struct a výčtu.

Předdefinované číselné typy jsou struktur a mají vlastnosti a metody, které lze:

// Static method on type Byte.
byte b = Byte.MaxValue;

Ale deklarovat a přiřadit k nim hodnoty, jako kdyby byly jednoduché typy souhrnného ukazatele:

byte num = 0xA;
int i = 5;
char c = 'Z';

Typy hodnoty jsou uzavřených, což například znamená, že nelze odvodit z typu System.Int32, a nelze definovat struct zdědit všechny uživatelem definované třídy nebo struct, protože struktura může dědit pouze z System.ValueType.Struktura však lze implementovat jedno nebo více rozhraní.Můžete obsadit typ struct k typu rozhraní; To způsobí, že boxerská operace ve spravovaných haldách zalomení struct uvnitř objektu typu odkaz.Operace boxerská dojít při předání typ hodnoty na metodu, která trvá System.Object jako vstupní parametr.Další informace naleznete v tématu Boxing a Unboxing (C# programování Guide).

Použití struct klíčové slovo vytvořit vlastní typy vlastní hodnoty.Obvykle se struktura používá jako kontejner pro malou skupinu příbuzných proměnných, jak ukazuje následující příklad:

public struct CoOrds
{
    public int x, y;

    public CoOrds(int p1, int p2)
    {
        x = p1;
        y = p2;
    }
}

Další informace o strukturách, viz Struktur (Příručka programování C#).Další informace o typech hodnotu v .NET Framework, viz Specifikace CTS (Common Type System).

Ostatní kategorie typů hodnot je výčtu.Výčet definuje sadu pojmenované nedílnou konstanty.Například System.IO.FileMode ve výčtu.NET Framework, knihovna tříd obsahuje sadu s názvem konstantní celých čísel, které určují, jak by měl být soubor otevřen.Je definována jako v následujícím příkladu:

public enum FileMode
{
    CreateNew = 1,
    Create = 2,
    Open = 3,
    OpenOrCreate = 4,
    Truncate = 5,
    Append = 6,
}

System.IO.FileMode.Create Konstanta má hodnotu 2.Název je však mnohem smysluplnější člověka čtení zdrojového kódu a je lepší používat vyčíslení místo čísel konstantní literál z toho důvodu je.Další informace naleznete v tématu System.IO.FileMode.

Všechny výčty dědit z System.Enum, které dědí z System.ValueType.Pravidla, které se týkají struktur se také u výčtů.Další informace o výčty viz Výčet typů (Příručka programování C#).

ms173104.collapse_all(cs-cz,VS.110).gifOdkazové typy

Typ, který je definován jako třídy, delegáta, pole, nebo rozhraní je Typ odkazu.Za běhu při deklarování proměnné typu odkazu proměnná obsahuje hodnotu null dokud explicitně pomocí vytvoření instance objektu nové operátor, nebo ji přiřadit objekt, který byl vytvořen jinde pomocínew, as shown in the following example:

MyClass mc = new MyClass();
MyClass mc2 = mc;

Rozhraní musí být inicializována s objekt třídy, která implementuje.Pokud MyClass implementuje IMyInterface, vytvořte instanci IMyInterface jak ukazuje následující příklad:

IMyInterface iface = new MyClass();

Při vytvoření objektu paměť je přiděleno spravovaných haldách a proměnná obsahuje pouze odkaz na umístění objektu.Typy ve spravovaných haldách vyžadují režie, i když jsou přidělovány při jsou převzaty systémem pro funkce správy paměti automatického CLR, který je znám jako uvolněné.Je také vysoce optimalizována uvolněné a ve většině scénářů problém výkonu nevytvoří.Další informace o uvolnění paměti získáte v tématu Automatická správa paměti.

Všechna pole jsou typy odkazů i v případě, že jejich prvky jsou typy hodnot.Matice implicitně odvodit z System.Array třídy, ale deklarovat a použít zjednodušené syntaxe, poskytované C#, jak ukazuje následující příklad:

// Declare and initialize an array of integers.
int[] nums = { 1, 2, 3, 4, 5 };

// Access an instance property of System.Array.
int len = nums.Length;

Typy odkazů plně podporují dědění.Při vytváření třídy přebírají z jiných rozhraní nebo třídu, která není definována jako uzavřených, a ostatní třídy mohou dědit ze třídy a přepsat virtuální metody.Další informace o vytvoření vlastní třídy Třídy a struktur (Příručka programování C#).Další informace o dědičnosti a virtuální metody viz Dědičnost (Příručka programování C#).

Typy literálů

V jazyce C# přijímat literálové hodnoty typu kompilátoru.Můžete určit, jak by měla být zadána číselný literál připojením na konec číslo písmeno.Například chcete-li určit hodnotu 4.56 zachází jako plovoucí, připojit "f" nebo "F" za číslem: 4.56f.Pokud je připojeno žádné písmeno, kompilátor odvodí typ pro literál.Další informace o tom, které typy lze písmeno přípony, viz referenční stránky pro jednotlivé typy v Typy hodnot (C#-Reference).

Protože jsou zadány literály a všechny typy odvodit nakonec z System.Object, můžete napsat a zkompilovat například následující kód:

string s = "The answer is " + 5.ToString();
// Outputs: "The answer is 5"
Console.WriteLine(s);

Type type = 12345.GetType();
// Outputs: "System.Int32"
Console.WriteLine(type);

Obecné typy

Typ může být deklarován s jedním nebo více Parametry typu slouží jako zástupný symbol pro skutečný typ ( konkrétní typ), že bude při vytváření instance typu poskytovat Klientský kód.Tyto typy jsou označovány jako obecné typy.Například.NET Framework typu System.Collections.Generic.List<T> má jeden parametr typu, který podle úmluvy je uveden název t.Při vytváření instance typ zadejte typ objektů, které bude obsahovat seznam například řetězec:

List<string> strings = new List<string>();

Použití parametru typu umožňuje znovu použít stejné třídy držet bez převádění jednotlivých prvků na jakýkoli typ prvku, objektu.Obecnou kolekci třídy se nazývají silnými kolekce protože kompilátor zná konkrétní typ prvky v kolekci a zvýšit Chyba při kompilaci if, například se pokusíte přidat celé strings objektu v předchozím příkladu.Další informace naleznete v tématu Generics (Příručka programování C#).

Implicitní typy, anonymní typy a typy s možnou hodnotou Null

Jak bylo uvedeno dříve, implicitně zadání místní proměnné (ale nejsou členy třídy) pomocí var klíčové slovo.Proměnná obdrží typu v době kompilace, ale typ poskytované kompilátoru.Další informace naleznete v tématu Implicitně zadali místní proměnné (C# programování Guide).

V některých případech je obtížné vytvořit pojmenovaný typ pro jednoduché sady souvisejících hodnot, které nezamýšlíte ukládat nebo předat mimo hranice metoda.Můžete vytvořit anonymní typy pro tento účel.Další informace naleznete v tématu Anonymní typy (Příručka programování C#).

Běžné hodnoty typů nemůže mít hodnotu null.Však můžete vytvořit typy s možnou hodnotou Null hodnoty připevnění ? po typu.Například int? je int typ, který můžete mít také hodnotu null.CTS, s možnou hodnotou Null typy instance typu generic struct System.Nullable<T>.S možnou hodnotou Null typy jsou zvláště užitečné, když předáte data z databází, které mohou být číselné hodnoty null a.Další informace naleznete v tématu Typy s možnou hodnotou Null (Příručka programování C#).

Související oddíly

Další informace naleznete v následujících tématech:

Specifikace jazyka C#

Další informace naleznete v tématu Specifikace jazyka C#. Specifikace jazyka je úplným a rozhodujícím zdrojem pro syntaxi a použití jazyka C#.

Viz také

Referenční dokumentace

Datové typy, porovnání v různých jazycích

Nedílnou tabulky typy (C#-Reference)

Koncepty

Příručka programování C#

Conversion of XML Data Types

Další zdroje

C#-Reference