Instance hodnotových typů (proměnné) jsou ukládány na zásobník programu a program s nimi pracuje přímo. Hodnotové proměnné, jak napovídá jejich název, obsahují pouze hodnotu proměnné daného typu bez jakýchkoliv doplňujících informací. Hodnotové typy v jazyce C# lze dále rozdělit do tří kategorií: základní typy, struktury a výčtové typy.
Základní typy se příliš neliší od jiných programovacích jazyků. Základních typů je 14.
Seznam primitivních celočíselných datových typů vyskytujících se v C# je uveden v tabulce primitivních datových typů celočíselných.
Tabulka 3.1. Primitivní datové typy celočíselné
Typ | Rozsah | Velikost | Typ v .NET Framework |
---|---|---|---|
sbyte | -128 | znaménkové 8-bitové celé číslo | System.SByte |
byte | 0 až 255 | neznaménkové 8-bitové celé číslo | System.Byte |
char | U+0000 až U+ffff | Unicode 16-bitový znak | System.Char |
short | -32 768 až 32 767 | znaménkové 16-bitové celé číslo | System.Int16 |
ushort | 0 až 65535 | neznaménkové 16-bitové celé číslo | System.UInt16 |
int | -2 147 483 648 až 2 147 483 647 | znaménkové 32-bitové celé číslo | System.Int32 |
uint | 0 až 4 294 967 295 | neznaménkové 32-bitové celé číslo | System.UInt32 |
long | -9 223 372 036 854 775 808 až 9 223 372 036 854 775 807 | znaménkové 64-bitové celé číslo | System.Int64 |
ulong | 0 až 18 446 744 073 709 551 615 | neznaménkové 64-bitové celé číslo | System.UInt64 |
Při přiřazování hodnot proměnným nesmíme zapomenout na to, jak se v C# s čísly zachází. Pokud pracujeme s typem byte, nelze napříkad jednotlivé proměnné typu byte sčítat bez explicitní konverze do byte.
byte x = 1, y = 2, sum = 0; sum = x + y; // nelze implicitne konvertovat int na byte (operator +) byte x = 1, y = 2, sum = 0; sum = (byte)(x + y); // explicitni konverze, toto lze |
Pokud také používáme přetížené metody, které mají např. jako parametr typ int a následně typ byte, musíme explicitně uvést, s jakou metodou chceme pracovat, aby se program zachoval korektně.
public void MaMetoda(int x) {} public void MaMetoda(byte x) {} ... MaMetoda(3); // zavola se metoda s parametrem typu int MaMetoda((byte)3); // zavola se metoda s parametrem typu byte |
Jazyk C# obsahuje datové typy float a double pro počítání s desetinnou čárkou a navíc obsahuje typ decimal. Tento typ je 128-bitový a je vhodný pro měnové a peněžní operace. Má větší přesnost a menší rozsah než zbylé dva reálné datové typy.
Tabulka 3.2. Reálné datové typy a typ decimal
Typ | Přibližný rozsah | Přesnost | Typ .NET Framwork |
---|---|---|---|
float | 1,5x10-45 až 3,4x1038 | 7 desetinných míst | System.Single |
double | 5x10-324 až 1,7x10308 | 15-16 desetinných míst | System.Double |
decimal | 1, x10-28 až 7,9x1028 | 28-29 podstatných des. míst | System.Decimal |
Mezi typy s pohyblivou desetinnou čárkou a typem decimal neexistuje implicitní konverze. Proto vždy, když budeme provádět konverzi na (z) tento typ (tohoto typu), musíme explicitně uvést typ, do kterého se má převádět. Zároveň reálná konstanta se považuje za typ double, tedy i tehdy při přiřazení hodnoty do proměnné typu decimal musíme za konstantou uvést příponu (m, M).
Struktury jsou vlastně uživatelsky definovaným hodnotovým typem. Je to jakási odlehčená třída. Od tříd se ale liší. Proměnné typu struktura jsou umístěny na zásobník, struktury nepodporují dědičnost a struktura sama se nemůže stát základem pro vytvoření nového typu. Struktury jsou logickým sdružením atributů, metod, vlastností, indexerů, operátorů, a případně dalších vnořených typů. Struktury mohou mít definovány dokonce i konstruktory.
struct Zvirata_A_Nohy { int pocetNohou; string nazevZvirete; public Zvirata_A_Nohy(int novyPocetNohou, string novyNazevZvirete) { pocetNohou = novyPocetNohou; nazevZvirete = novyNazevZvirete; } public int vratPocetNohou() { return pocetNohou; } public string vratNazevZvirete() { return nazevZvirete; } } |
Když máme takto vytvořenou strukturu a chceme ji někde použít, je třeba vytvořit její instanci pomocí operátoru new. Pak už můžeme využívat všeho, co nám daná struktura nabízí.
Celý příklad se nachází na tomto místě. |
Výčtové typy se hodí pro celočíselné konstanty. Právě díky tomu, že každé položce ve výčtovém typu můžeme přiřadit i jejich hodnoty. Dokonce lze dvěma položkám přiřadit stejnou hodnotu a C# si potom vybere jednu hodnotu jako primární (z důvodů reflexe a řetězcových konverzí). Výčtové typy mají následující omezení:
nemohou definovat své vlastní metody
nemohou implementovat rozhraní
nemohou definovat své indexery nebo vlastnosti
enum DnyVTydnu { neděle, pondělí, úterý, středa, čtvrtek, pátek, sobota }; |
Pokud není uvedeno explicitně jinak, první položka má hodnotu 0. Pokud bychom chtěli získat hodnoty jednotlivých položek, musíme opět provést explicitní konverzi.
int i = DnyVTydnu.neděle; // toto nelze int i = (int)DnyVTydnu.neděle; // toto je spravne |
Před klíčovým slovem enum mohou být rovněž modifikátory určující místo použití - private, public, protected, internal.