Programovanie

Ako pracovať so štruktúrami v C #

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.

$config[zx-auto] not found$config[zx-overlay] not found