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
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é slovoVelikostRozsah hodnot
byte8 bitů0 až 255
sbyte8 bitů-128 až 127
short16 bitů-32 768 až 32 767
ushort16 bitů0 až 65 535
int32 bitů-2 147 483 648 až 2 147 483 647
uint32 bitů0 až 4 294 967 295
long64 bitů-9 223 372 036 854 775 808 až 9 223…
ulong64 bitů0 až 18 446 744 073 709 551 615
char16 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é slovoVelikostPřesnostPoužití
float32 bitů~7 desetinných číslicMéně přesné, ale úsporné
double64 bitů~15-16 desetinných číslicVýchozí volba
decimal128 bitů~28-29 desetinných číslicFinanční výpočty (vysoká přesnost)
float teplota = 36.6f;
double vzdalenost = 12345.6789;
decimal cena = 199.99m;

Pravdivostní hodnoty

Klíčové slovoVelikostPoužití
bool1 bittrue/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: 200

Struktura

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})";
}