Hodnotové datové typy jsou datové typy, jejichž hodnota je uložena přímo v paměti. Jejich opakem jsou referenční datové typy, které si udržují v paměti umístění dat (referenci na data).
Jsou uloženy na zásobníku a jsou paměťově efektivnější pro ukládání malých dat. Kdykoliv je do nich přiřazována hodnota nebo jsou předávány do metod, tak dochází ke kopii této hodnoty.
Zásobník
- Oblast paměti
- Slouží pro dočasné ukládání dat (lokální proměnné, parametry metod)
- Velikost je omezená – maximálně jednotky MB
- Princip LIFO (Last In, First Out) – poslední uložený prvek se odebírá jako první
- Je rychlý, protože alokace i dealokace probíhají automaticky (při vstupu a výstupu z metody)

Více o zásobníku lze nalézt na stránce Zásobník.
Datové typy
Speciální hodnoty
- literál = číslo, znak, nebo řetězec, který je přítomný přímo v kódu programu
- konstanta = proměnná, která obsahuje konstantní (tzn. neměnnou) hodnotu po celou dobu běhu programu
- Označuje se klíčovým slovíčkem
const - Typicky se umisťuje do tříd
- Označuje se klíčovým slovíčkem
public class RequestSender
{
// _maxRequestSize je konstanta
// číslo 500 je literál
private const string _maxRequestSize = 500;
}Celočíselné typy
V jazyce C# se celá čísla používají k reprezentaci čísel bez desetinné části. Tyto typy jsou všechny hodnotové typy.
| Klíčové slovo | Velikost | Rozsah hodnot |
|---|---|---|
byte | 8 bitů | 0 až 255 |
sbyte | 8 bitů | -128 až 127 |
short | 16 bitů | -32 768 až 32 767 |
ushort | 16 bitů | 0 až 65 535 |
int | 32 bitů | -2 147 483 648 až 2 147 483 647 |
uint | 32 bitů | 0 až 4 294 967 295 |
long | 64 bitů | -9 223 372 036 854 775 808 až 9 223… |
ulong | 64 bitů | 0 až 18 446 744 073 709 551 615 |
char | 16 bitů | 0 až 65 535 (Unicode znak) |
byte vek = 25;
int pocet = 1000;
long populacniCislo = 8000000000;
char znak = 'A';Znaménkovost
Datové typy lze rozdělit na znaménkové a bezznaménkové. Bezznaménkové datové typy začínají na u (ushort, unit…) a lze do nich uložit pouze nezáporná čísla.
Reálná čísla
Slouží pro uložení tzv. strojových čísel – desetinná čísla s konečnou přesností.
Lze je rozdělit na:
- Čísla s plovoucí řádovou čárkou –
float,double - Čísla s pevnou řádovou čárkou –
decimal
| Klíčové slovo | Velikost | Přesnost | Použití |
|---|---|---|---|
float | 32 bitů | ~7 desetinných číslic | Méně přesné, ale úsporné |
double | 64 bitů | ~15-16 desetinných číslic | Výchozí volba |
decimal | 128 bitů | ~28-29 desetinných číslic | Finanční výpočty (vysoká přesnost) |
float teplota = 36.6f;
double vzdalenost = 12345.6789;
decimal cena = 199.99m;Pravdivostní hodnoty
| Klíčové slovo | Velikost | Použití |
|---|---|---|
bool | 1 bit | true/false |
bool val = true;Výčet (enum)
Hodnotový datový typ, který slouží k definici jmenných konstant. Kód vytváří čitelnější, typově bezpečný (Kompilátor dokáže ověřit správnost, to např. při použití řetězců nelze) a organizovaný, když se pracuje s množinami hodnot.
enum Day
{
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
}Na pozadí se pro hodnoty využívají int hodnoty s hodnotou začínající 0. Toto je možné přepsat pomocí =.
enum StatusCode
{
Success = 200,
BadRequest = 400,
NotAuthorized, // Hodnota: 401 – hodnota předchozího + 1
ServerError = 500
}Přístup k jednotlivým položkám výčtu je možný skrze <NazevEnumu>.<PolozkaEnumu>. Z výčtu je možné nazpět získat int hodnotu pomocí explicitní konverze na int.
StatusCode code = StatusCode.Success;
Console.WriteLine((int) code); // Output: 200Struktura
Struktura je heterogenní datový typ, do kterého lze uložit více hodnot různých datových typů. Zapouzdřuje data a spojenou funkcionalitu. Struktury mají hodnotovou sémantiku, tedy při přiřazení dochází ke kopírování.
Typické použití struktur je pro reprezentaci malých skupin souvisejících dat – např. bod (Point) jako dvojice souřadnic X a Y.
V rámci struktur je možné definovat i metody, využívat dědění, používat konstruktor stejně jako ve třídách. V případě, že by bylo potřeba využít referenční sémantiku (práci s referencemi) nebo tvořit něco, co obsahuje rozsáhlou business logiku je vhodné využít třídy (classes).
public struct Point
{
public Point(double x, double y)
{
X = x;
Y = y;
}
public double X { get; }
public double Y { get; }
public override string ToString() => $"({X}, {Y})";
}