Kako raditi sa strukturama u C #

Iako postoji puno sličnosti između klase i strukture, postoje i neke izrazite razlike. Najvažnije je da je struktura za razliku od klase vrijednosni tip. Dakle, dok su primjerci klase pohranjeni u hrpi, primjerci strukture pohranjeni su u stog.

Kada se instanca strukture proslijedi metodi, ona se uvijek prosljeđuje po vrijednosti. To je za razliku od onoga što se događa kada instancu klase proslijedimo metodu - instanca se prosljeđuje referencom.

Strukture programiranja na C #

Evo kako izgleda sintaksa za deklariranje strukture.

struct

{

//Data members and member functions of the struct

}

The following code snippet shows how a typical struct definition looks like.

struct Rectangle

    {

        public int width;

        public int height;

    }

Sada članovima strukture koju ste prethodno definirali možete dodijeliti vrijednosti, kao što je prikazano u isječku koda u nastavku.

Rectangle rectangle = new Rectangle();

rectangle.width = 10;

rectangle.height = 15;

Gornji isječak koda stvara instancu strukture Rectangle i dodjeljuje vrijednosti javnim članovima. Imajte na umu da unutar strukture možete imati i podatke o članovima i metode. Također, članove možete odrediti kao privatne, javne i interne. Treba napomenuti da za razliku od klasa, u strukturama ne možete imati inicijalizatore polja za nestatična polja. Stoga izjave poput sljedeće u strukturi nisu valjane.

int width = 10;

int height = 15;

U svakom slučaju možete inicijalizirati statičke članove u svojim strukturama. Stoga je slijedeća valjana izjava unutar strukture.

static int area = 0;

Dodajmo sada nekoliko metoda u strukturu. Evo ažurirane verzije strukture Rectangle koju smo ranije stvorili. Obratite pažnju na upotrebu parametriziranog konstruktora.

struct Rectangle

    {

        int width;

        int height;

        public Rectangle(int width, int height)

        {

            this.width = width;

            this.height = height;

        }

        public int GetArea()

        {

            return this.width * this.height;

        }

    }

Imajte na umu da čak i ako vam struktura ne dopušta da definirate eksplicitni konstruktor bez parametara unutar nje, uvijek možete imati konstruktore parametara unutar strukture. Također, slično klasi, i u strukturi možete imati preopterećene konstruktore. Evo kako možete postaviti vrijednosti pomoću konstruktora strukture Rectangle, a zatim dobiti područje pozivanjem metode GetArea (). Treba napomenuti da slično klasi, u strukturi možete imati statičke i nestatičke metode.

static void Main(string[] args)

        {

            Rectangle rectangle = new Rectangle(10, 15);

            int area = rectangle.GetArea();

            Console.WriteLine("The area is: " + area.ToString());

            Console.Read();

        }

Poput klase, struktura pruža podršku svojstvima i indeksatorima. Jedna od glavnih razlika između strukture i klase je ta što za razliku od klase, struktura ne podržava nasljeđivanje - ne možete imati strukturu koja proširuje drugu klasu ili strukturu. Međutim, slično klasi kao i struktura, može implementirati sučelje. Evo primjera koda koji to ilustrira.

 interface IRectangle

    {

        int GetArea();

    }

  struct Rectangle : IRectangle

    {

        int width;

        int height;

        public Rectangle(int width, int height)

        {

            this.width = width;

            this.height = height;

        }

        public int GetArea()

        {

            return this.width * this.height;

        }

    }

Izbor između klase i strukture

Sada smo došli do zanimljive točke rasprave. Kada bismo trebali koristiti strukturu u odnosu na klasu i obrnuto?

Kao što smo ranije raspravljali u ovom članku, instanca strukture kreira se u stogu, dok se instanca klase kreira u upravljanoj hrpi. Dodjela i oslobađanje vrsta vrijednosti jeftinije su od referentnih vrsta. Struktura je dobar izbor kada trebate stvoriti složeni tip podataka koji bi sadržavao nekoliko članova podataka. U idealnom slučaju, veličina članova podataka strukture trebala bi biti manja od 16 bajtova. Za strukturu se možete odlučiti kada želite izgraditi malu kompozitnu strukturu podataka koja ima vrijednosnu semantiku i sadrži samo nekoliko članova podataka. Korištenjem struct u takvim slučajevima možete izbjeći režijske troškove povezane s odvozom smeća.

Pri radu sa strukturama trebali biste se pridržavati preporučenih najboljih praksi. Trebali biste izbjegavati upotrebu strukture veće veličine od preporučene u ovom članku. Također, imajte na umu da su prosljeđivanje instanci struktura metodama skuplje u smislu izvedbe od prosljeđivanja instanci klasa. Preporučljivo je koristiti strukture kada radite s malim podatkovnim strukturama. O ovoj temi možete saznati više iz ovog MSDN članka.