Wednesday, December 09, 2015

Strukture u C# programskom jeziku


Struktura jeste slična klasi ali nije klasa, koristi se slično enumeracijama ali nije enumeracija jer nema nabrajanja. Najjednostavnije rečeno, struktura vam je vrednosni tip podataka koji služi da enkapsulirate manji skup podataka. Za razliku od klasa koji su referentni tip i koji se kreiraju na hipu, strukture se kreiraju na steku i sve dok je struktura mala, upravljanje memorijom koja upravlja hipom je znatno smanjeno. Možete se pitati zašto je to bitno, zar sad treba da razmišljate i o memoriji dok programirate. U principu uvek treba u programiranju da razmišljate o memoriji bez obzira koliko je imate u računaru. Da bi vam bilo jasnije, treba da znate da je memorija računara definisana u tri segmenta. U tekst ili kod segment, stek segment i hip segment.





( Strukture su vrednosni tip podataka )
 

Kad npr. otvorite *.exe datoteku, sav taj mašinski, ljudski nečitljiv kod se stavlja u tekst segment ili kako ga češće zovu kod segment memorije. Stek segment se uglavnom koristi za čuvanje privremenih podataka, često u obliku promenjivih i automatskih metoda, dok se hip segment više koristi za različite svrhe programa s obzirom da se bavi dinamičkom raspodelom memorije. U hip segmentu memorije, obrazac raspodele memorije nije poznat tokom izvršavanja memorije. Ono što je najbitnije da upamtite je da se stek segment brže izvršava od hip segmenta ali je zato stek segment memorije manji i skuplji. U principu, vi već naveliko koristite strukture kad god koristite vrednosne ili primitivne tipove poput int, long ili float. Svi ovi tipovi su strukture koje pored članova struktura sadrže i metode koje možete da pozovete poput ToString, Parse ili MaxValue. Struktura se deklariše kao i enumeracija ili klasa, samo što koristi ključnu reč struct. Sintaksa strukture je:

Struct ime_strukture
{
       članovi_strukture;
};


Članovi strukture mogu imati pored promenjivih i metode i čak konstruktore. Strukture jesu izvedene iz klase Object, ali one ne mogu da vrše nasleđivanje. To u prevodu znači da struktura ne može da sadrži druge strukture ili klase. Vi ne možete imati konstruktor u strukturi koji ne uzima ni jedan parametar. On već postoji i implicitno inicijalizuje na nulu sva polja u strukturi. Struktura ne može da sadrži dekonstruktor. Vi ne morate da koristite ključnu reč new da instacirate članove strukture ali nije zabranjeno. To takođe ne znači da će te sa ključnom rečju new prebaciti deo memorije strukture sa steka na hip. Struktura se isključivo formira u stek segmentu.

Kako se koriste strukture u programu


Pogledajte kod sledećeg programa koji namerno sadrži 3 strukture za istu svrhu, samo da bi vam demonstrirao da strukturu možete da koristite na više načina. U suštini ukoliko imate potrebu za članovima, metodama i konstruktorima, moj savet vam je da u tom slučaju pravite klasu. Jer kad nešto počnete da pravite, potrebno je i da pretpostavite da će se to možda proširivati.

using System;
using static System.Console;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Structures
{
    struct FullName1
    {
        public string FirstName;
        public string LastName;

    }

    struct FullName2
    {
        public string FirstName;
        public string LastName;

        public string FullName()
        {
            return $"{FirstName} {LastName}";

        }
    }

    struct FullName3
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }

        public FullName3 (string firstName, string lastName)
        {
            FirstName = firstName;
            LastName = lastName;

        }

        public string FullName()
        {
            return $"{FirstName} {LastName}";

        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            bool correct = false;
            string firstName, lastName;

            do
            {
                Write("Your first name: ");
                firstName = ReadLine();

            } while (correct = String.IsNullOrWhiteSpace(firstName));

            do
            {
                Write("Your last name: ");
                lastName = ReadLine();

            } while (correct = String.IsNullOrWhiteSpace(lastName));

            FullName1 fullName1;
            fullName1.FirstName = firstName;
            fullName1.LastName = lastName;

            WriteLine($"\nYour full name through the structure with only variables.\n{fullName1.FirstName} {fullName1.LastName}");
            WriteLine();

            FullName2 fullName2 = new FullName2();
            fullName2.FirstName = firstName;
            fullName2.LastName = lastName;

            WriteLine($"\nYour full name through the structure with variables and a method.\n{fullName2.FullName()}");
            WriteLine();

            FullName3 fullName3 = new FullName3(firstName, lastName);

            WriteLine($"\nYour full name through the structure with variables,a constructor and a method.\n{fullName3.FullName()}");

            ReadKey();

        }
    }
}

Prva struktura u navedenom kodu sadrži samo promenjive kao članove. To je najčešća upotreba strukture. Ovakva upotreba strukture nema nikad deklarisan ni jedan član kao privatan, jer mu onda ne bi ste mogli pristupati. Kao što možete videti prva struktura se može deklariše bez upotrebe ključne reči new. Druga struktura sadrži i metodu koja ne prihvata nikakve parametre. Konstruktori u strukturi ne mogu da budu bez parametara, ali metode mogu. Treća struktura pored promenjivih, metode sadrži i konstruktor. Bez obzira ako još ne znate šta je konstruktor, o njemu ću pisati u narednim postovima; inače vi možete videti da sa konstruktorom sama inicijalizacija promenjivih u strukturi je lakša. Strukture same po sebi su korisne i trebate ih koristiti uvek kada želite da grupišete manji skup promenjivih. Koristiti strukture u kodu se takođe smatra čitljivijim kodom. Prava upotreba strukture je često prepuštena samo vama. Kad pokrenete navedeni program rezultati će prikazati istu vrednost kroz sve tri strukture.

Your first name: Manuel
Your last name: Radovanovic

Your full name through the structure with only variables.
Manuel Radovanovic

Your full name through the structure with variables and a method.
Manuel Radovanovic

Your full name through the structure with variables,a constructor and a method.
Manuel Radovanovic


Kako to sve izgleda možete videti i na video-u:









( C# 6.0 Tutorial - Fundamentals - 22. Structures )    

5 comments:

  1. Svaa čast, stvarno lepo objašnjena struktura. Moram ovo pokazati moji učenicima.

    ReplyDelete
  2. Sve u blogu vezano za C# je zaista odlicno, sve pohvale!
    Postoji jedan deo koji me je podstakao da se zapitam.
    "To u prevodu znači da struktura ne može da sadrži druge strukture ili klase." Da li se ovde misli da struktura ne moze da sadrzi polje tipa neke klase? Ovo sam videla na jos par mesta, ne znam kako se tumaci, i updavo sam istrazila i struktura podataka moze da sadrzi polje tipa neke klase. Ne znam da li sam onda citiranu recenicu pogresno protumacila.

    ReplyDelete
    Replies
    1. To znači da ne možete u strukturi praviti drugu strukturu ili klasu kao što ne možete praviti klasu u klasi. Vi možete koristiti već napravljenu strukturu u strukturi ali koliko je to pametna ideja, to je već neka druga priča. Hvala na komentaru i što posećujete moj blog.

      Delete
  3. Zaista odlična objašnjenja ne samo za strukture, već sve vezano za C#!

    ReplyDelete