Statistika testů
K této kapitole
Zodpovězených: 0
Správně: 0
Špatně: 0
Úspěšnost: 0%
Nezodpovězených: 0

Pro testování a jeho statistické vyhodnocení je nutné se přihlásit.


Celkem
Zodpovězených: 0
Správně: 0
Špatně: 0
Úspěšnost: 0%
Nezodpovězených: 0

Datový typ
Ukážeme si, co je to datový typ a jak dělíme datové typy z různých hledisek.
RNDr. Dušan Kovář, Ph.D.
27. listopadu 2005
Počet návštěv: 35310

Datový typ proměnné určuje, jak je proměnná uložena v paměti  a jaké operace lze s proměnnou provádět. Veškeré datové typy můžeme rozdělit na:

  1. Hodnotové typy (value types)
  2. Odkazové (referenční) typy (reference types)

Proměnná hodnotového typu má svou hodnotu přímo uloženu v paměti, kterou označujeme zásobník (stack):

Příkladem hodnotového typu je typ int, který slouží pro celočíselné proměnné. Ukažme si na příkladu, jak je hodnota každé proměnné typu int uložena samostatně:

using System;

namespace DatovyTyp.Priklad1
{
   class VstupniBodProgramu
   {
      static void Main()
      {
         // Inicializujeme proměnnou i na hodnotu 5:
         int i = 5;
         // Deklarujeme proměnnou j:
         int j;
         // Do proměnné j přiřadíme hodnotu i:
         j = i;
         // Vypíšeme hodnoty proměnných:
         Console.WriteLine("i = {0}, j = {1}", i, j);
         // Změníme hodnotu proměnné j na 10:
         j = 10;
         // A opět vypíšeme hodnoty proměnných:
         Console.WriteLine("i = {0}, j = {1}", i, j);

         Console.ReadLine();
      }
   }
}

Na příkazovém řádku obdržíme následující výpis:

i = 5, j = 5
i = 5, j = 10

Všimněme si, že změnou hodnoty proměnné j nedošlo ke změně hodnoty proměnné i. Tyto hodnoty jsou uloženy samostatně v paměti, jak je znázorněno na následujícím obrázku.

Proměnná odkazového (referenčního) typu má uložen pouze odkaz (referenci) na skutečnou hodnotu. Abychom mohli s takovou proměnnou pracovat, musí existovat i odkazovaná hodnota. Tyto hodnoty jsou ukládány do jiné oblasti paměti, která se nazývá spravovaná halda (managed heap):

Naprostá většina datových typů na platformě .NET tvoří odkazové typy. Na následujícím programu demonstrujme rozdíl mezi hodnotovými a odkazovými datovými typy.

using System;

namespace DatovyTyp.Priklad2
{
   class VstupniBodProgramu
   {
      static void Main()
      {
         // Vytvoříme objekt nazvaný objekt1 z třídy TridaA:
         TridaA objekt1 = new TridaA();
         // Nastavíme položku Cislo proměnné objekt1 na 5:
         objekt1.Cislo = 5;
         // Deklarujeme objekt nazvaný objekt2
         // a inicializujeme ho pomocí objekt1:
         TridaA objekt2 = objekt1;
         // Vypíšeme hodnoty proměnných:
         Console.WriteLine("objekt1.Cislo = {0}, objekt2.Cislo = {1}",
            objekt1.Cislo, objekt2.Cislo);
         // Nastavíme položku Cislo proměnné objekt2 na 10:
         objekt2.Cislo = 10;
         // A opět vypíšeme hodnoty proměnných:
         Console.WriteLine("objekt1.Cislo = {0}, objekt2.Cislo = {1}",
            objekt1.Cislo, objekt2.Cislo);

         Console.ReadLine();
      }
   }

   // Deklarace třídy TridaA:
   class TridaA
   {
      // Deklarace položky Cislo:
      public int Cislo;
   }
}

Na příkazovém řádku se objeví následující:

objekt1.Cislo = 5, objekt2.Cislo = 5
objekt1.Cislo = 10, objekt2.Cislo = 10

V tomto příkladu máme dvě třídy. Jedna obsahuje jednu statickou metodu Main. Taková třída je v programu nezbytná. Druhá třída se jmenuje TridaA. Třída slouží k vytváření objektů. Třída je typickým představitelem referenčního datového typu. Na řádku

TridaA objekt1 = new TridaA(); 

deklarujeme proměnnou objekt1 typu TridaA. Tato proměnná může obsahovat odkaz do paměti (haldy), kde je uložena odpovídající hodnota. Pokud chceme vytvořit i tuto hodnotu, musíme použít klíčové slovo new. Dále nastavíme hodnotu položky Cislo na 10. Na řádku:

TridaA objekt2 = objekt1; 

deklarujeme proměnnou objekt2. Všimněte si však, že nevytváříme odpovídající hodnotu pomocí operátoru new, ale pouze přiřadíme objekt1 do objekt2. Přiřazuje se odkaz ne odkazovaná hodnota, což demonstrujeme změnou položky Cislo objektu objekt2, čímž se změní také hodnota Cislo objektu objekt1. Odkazuje se do téže paměti, což opět demonstrujme obrázkem:

V případě, že referenční proměnná neodkazuje na existující hodnotu, obsahuje hodnotu null.



Úkoly ke kapitole "Datový typ"

Deklarujte opět třídu TridaA s jednou veřejnou položkou Cislo typu int. V Main deklarujte pouze referenci na instanci typu TridaA, ale nevytvářejte hodnotu pomocí operátoru new. Dále zkuste přiřadit do dané položky Cislo hodnotu a přesvědčte se, že takový pokus skončí chybou při překladu. Všimněte si chybového hlášení a snažte se mu porozumět.

Hodnocení kapitoly "Datový typ"
Oslovila vás tato kapitola?
Ohodnoťte její obsah počtem bodů od 1 (nejhorší) do 10 (nejlepší):
Průměrné hodnocení: 7,785714
Celkem hodnotilo 14 osob.
Jednotlivá hodnocení: 
Diskuze ke kapitole "Datový typ"

Napadá vás zajímavá otázka související s touto kapitolou?

Přidejte do diskuze
Zatím diskutovaná témata:

krtku čti! [666 Cermat, 10.11.2016 12:50:45 ]  
Tvoje máma je tak velká, že jí kvůli tobě nefunguje C#
krteček [666, 10.11.2016 12:48:22 ]  
achojky krtku
Už to začíná [Keyzio, 24.5.2006 17:44:52 ]  
Jedu vašimy lekcemi popořadě a poprvé jsem narazil na něco u čeho musím přemýšlet

Vyhledávání
Související kapitoly
Používáme proměnné
Použití proměnné. Její datový typ, deklarace, přiřazení, inicializace ...
Přečtěte si knihu
C# Programujeme profesionálně
Robinson S., Allen K. S., Cornes O., Glynn J., Greenvoss Z., Harvey B., Nagel Ch. a další
Computer Press 2003

Programování v Microsoft .NET - Webové aplikace
Prosise, Jeff
Computer Press 2002

Programování Microsoft Windows v jazyce C#
Charles Petzold
Computer Press 2003
Programovací jazyk C# | Programování Windows Forms | Architektura .NET | ASP.NET | Dodatky | Diskuze
RNDr. Dušan Kovář, Ph.D.
Gymnázium Olomouc-Hejčín