1. Hodnotové typy

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.

1.1. Primitivní datové typy

Základní typy se příliš neliší od jiných programovacích jazyků. Základních typů je 14.

1.1.1. Celočíselné datové typy

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é

TypRozsahVelikostTyp v .NET Framework
sbyte-128znaménkové 8-bitové celé čísloSystem.SByte
byte0 až 255neznaménkové 8-bitové celé čísloSystem.Byte
charU+0000 až U+ffffUnicode 16-bitový znakSystem.Char
short-32 768 až 32 767znaménkové 16-bitové celé čísloSystem.Int16
ushort0 až 65535neznaménkové 16-bitové celé čísloSystem.UInt16
int-2 147 483 648 až 2 147 483 647znaménkové 32-bitové celé čísloSystem.Int32
uint0 až 4 294 967 295neznaménkové 32-bitové celé čísloSystem.UInt32
long-9 223 372 036 854 775 808 až 9 223 372 036 854 775 807znaménkové 64-bitové celé čísloSystem.Int64
ulong0 až 18 446 744 073 709 551 615neznaménkové 64-bitové celé čísloSystem.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.

[ukázka kódu]
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ě.

[ukázka kódu]
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

1.1.2. Reálné datové typy a typ decimal

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

TypPřibližný rozsahPřesnostTyp .NET Framwork
float1,5x10-45 až 3,4x10387 desetinných místSystem.Single
double5x10-324 až 1,7x1030815-16 desetinných místSystem.Double
decimal1, x10-28 až 7,9x102828-29 podstatných des. místSystem.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).

1.2. Struktury

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.

[ukázka kódu]
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í.

[příklad ke stažení]

Celý příklad se nachází na tomto místě.

1.3. Výčtové typy

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

[ukázka kódu]
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.

[ukázka kódu]
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.