Aj keď existuje veľa podobností medzi triedou a štruktúrou, existujú aj niektoré zreteľné rozdiely. Najdôležitejšie je, že štruktúra na rozdiel od triedy je typ hodnoty. Takže zatiaľ čo inštancie triedy sú uložené v halde, inštancie štruktúry sú uložené v zásobníku.
Keď sa inštancia štruktúry odovzdá metóde, vždy sa odovzdá podľa hodnoty. To je v kontraste s tým, čo sa stane, keď odovzdáme inštanciu triedy metóde - inštancia sa odovzdáva odkazom.
Programovacie štruktúry v C #
Tu je príklad, ako vyzerá syntax vyhlásenia štruktúry.
štruktúr
{
// Dátové členy a členské funkcie štruktúry
}
Nasledujúci úryvok kódu ukazuje, ako vyzerá obvyklá definícia štruktúry.
štruktúrny obdĺžnik
{
verejná int šírka;
verejná int výška;
}
Teraz môžete priradiť hodnoty členom štruktúr, ktoré ste definovali skôr, ako je to znázornené v útržku kódu nižšie.
Obdĺžnik obdĺžnika = nový Obdĺžnik ();
obdĺžnik.šírka = 10;
obdĺžnik.výška = 15;
Vyššie uvedený útržok kódu vytvára inštanciu štruktúry Obdĺžnik a prideľuje hodnoty jej verejným členom. Upozorňujeme, že v štruktúre môžete mať údaje aj metódy členov. Môžete tiež určiť členov ako súkromných, verejných a interných. Je potrebné poznamenať, že na rozdiel od tried nemôžete mať v štruktúrach inicializátory polí pre nestatické polia. Výroky ako nasledujúci v štruktúre preto nie sú platné.
int šírka = 10;
int výška = 15;
Statické členy môžete vo svojich štruktúrach inicializovať aj tak. Preto je nasledujúce platné vyhlásenie vo vnútri štruktúry.
statická int plocha = 0;
Poďme teraz do štruktúry pridať niekoľko metód. Tu je aktualizovaná verzia štruktúry Obdĺžnik, ktorú sme vytvorili predtým. Všimnite si použitie parametrizovaného konštruktora.
štruktúrny obdĺžnik
{
int šírka;
int výška;
verejný obdĺžnik (int šírka, výška int)
{
this.width = width;
this.height = výška;
}
public int GetArea ()
{
vrátiť túto.šírku * túto.výšku;
}
}
Všimnite si, že aj keď štruktúra neumožňuje definovať v nej explicitný bezparametrový konštruktor, v štruktúre môžete vždy mať konštruktory parametrov. Podobne ako v triede, aj v štruktúre môžete mať preťažené konštruktory. Tu je príklad, ako môžete nastaviť hodnoty pomocou konštruktora štruktúry Rectangle a potom získať oblasť vyvolaním metódy GetArea (). Je potrebné poznamenať, že podobne ako v triede, aj v štruktúre môžete mať statické a nestatické metódy.
static void Main (reťazec [] args)
{
Obdĺžnik obdĺžnika = nový Obdĺžnik (10, 15);
int area = obdĺžnik.GetArea ();
Console.WriteLine ("Oblasť je:" + area.ToString ());
Console.Read ();
}
Rovnako ako trieda, aj štruktúra poskytuje podporu pre vlastnosti a indexátory. Jedným z hlavných rozdielov medzi štruktúrou a triedou je, že na rozdiel od triedy nepodporuje štruktúra dedičnosť - nemôžete mať štruktúru, ktorá rozširuje inú triedu alebo štruktúru. Avšak podobne ako v triede, aj v štruktúre môže byť implementované rozhranie. Tu je príklad kódu, ktorý to ilustruje.
rozhranie IR Obdĺžnik
{
int GetArea ();
}
štruktúrny obdĺžnik: IRdĺžnik
{
int šírka;
int výška;
verejný obdĺžnik (int šírka, výška int)
{
this.width = width;
this.height = výška;
}
public int GetArea ()
{
vrátiť túto.šírku * túto.výšku;
}
}
Výber medzi triedou a štruktúrou
Teraz prichádzame k zaujímavému bodu debaty. Kedy by sme mali použiť štruktúru nad triedou a naopak?
Ako sme už diskutovali vyššie v tomto článku, inštancia štruktúry sa vytvorí v zásobníku, zatiaľ čo inštancia triedy sa vytvorí v spravovanej halde. Alokácia a deallokácia typov hodnoty sú lacnejšie ako referenčné typy. Štruktúra je dobrou voľbou, keď potrebujete vytvoriť zložený údajový typ, ktorý by obsahoval niekoľko údajových členov. V ideálnom prípade by veľkosť dátových členov štruktúry mala byť menšia ako 16 bajtov. Môžete sa rozhodnúť pre štruktúru, keď chcete vytvoriť malú zloženú dátovú štruktúru, ktorá má hodnotovú sémantiku a obsahuje iba niekoľko údajových členov. Pri použití štruktúry v takýchto prípadoch sa môžete vyhnúť réžii spojenej s odvozom odpadu.
Pri práci so štruktúrami by ste mali dodržiavať odporúčané najlepšie postupy. Mali by ste sa vyhnúť použitiu štruktúry, ktorá má väčšiu veľkosť, ako sa odporúča v tomto článku. Upozorňujeme tiež, že odovzdávanie inštancií štruktúr do metód je nákladnejšie z hľadiska výkonu ako odovzdávanie inštancií tried. Pri práci s malými dátovými štruktúrami sa odporúča používať štruktúry. Viac sa o tejto téme dozviete z tohto článku na webe MSDN.