четвртак, 24. децембар 2015.

Propertiji u C# programskom jeziku


Svojstva ili preciznije propertiji su članovi strukture, klase, interfejsa koji obezbeđuju fleksibilan mehanizam za čitanje, pisanje ili izračunavanje vrednosti nekog polja. Propertiji liče na polja ali se ponašaju kao metode. Propertije koristite kao da su članovi javnih promenjivih ali imajte u vidu da su propertiji posebne metode koje zovemo i Accessors – pristupne metode. Savetujem svakog programera da uvek koriste propertije umesto javno promenjivih u svojim klasama i radi bezbednosnih razloga. Ali iz iskustva vam mogu reći da za izračunavanje vrednosti nekog polja koje je kompleksnije uvek koristite metode a ne propertije. Ukoliko redovno pratite i čitate moje postove, o propertijima sam već pisao na postu o klasama u C# programskom jeziku, kog možete pogledati ovde. Propertije možete koristiti samo za čitanje, samo za pisanje, i za čitanje i pisanje. Kraće pisanje propertija nazivamo auto propertiji. Tokom evolucije C# programskog jezika do danas verzije 6.0; propertiji su napredovali do toga da danas možete inicijalizovati vrednost auto propertijima ili pisati auto propertije samo za čitanje.




( Propertiji u C# programskom jeziku )


Pojavom C# programskog jezika pojavili su se i propertiji što je bilo neobično jer C++ programski jezik nema propertije, već su oni došli u C# programski jezik kao ideja iz Visual Basic programskog jezika. Sintaksa za propertije je jednostavna:

private tip_podataka properti_promenjiva;
public tip_podatka ime_propertija
{
          get
         {
                    return properti_vrednost

         }
         set
        { 

                   podešavanje_svojsta

         }
}


Naravno, ova sintaksa se odnosi na svojstvo koje se čita i piše. Kad vam treba properti samo za čitanje izostvite set metodu iz propertija ili ako vam treba properti samo za pisanje, izostavite get metodu iz propertija. Imajte u vidu kada imate properti samo za čitanje da taj properti možete samo čitati, dok properti za pisanje možete koristiti samo za pisanje ali ne možete videti šta piše. Postavlja se pitanje zašto bi onda neko uopšte koristio properti samo za pisanje? To se uglavnom radi kada želite da koristite properti za skrivene informacije poput šifre. Pisanje na kraći način propertija se zove auto propertiji i sintaksa za auto properti je sledeća:

public tip_podatka ime_propertija { get; set }


Piše se bez tačke zareza ; iza veliki zagrada za kraj reda. Propertiji mogu biti u domenu public, private ili protected. Metode propertija ne moraju da se posebno deklarišu ali zato metoda get ili set može biti definisan drugačije od propertija. Samo jedna metoda get ili set može biti drugačije definisana ali morate voditi računa da modifikator ne sme da bude manje restriktivan od pristupa svojstvu. Npr. ako je properti deklarisan kao private, ne možete njegovu metodu set ili get definisati kao public, dok obratno možete.

U propertijima možete imati samo jednu get i samo jednu set metodu. Propertije ne možete da koristite kao ref ili out argument u metodi i properti ne može da sadrži druge metode, polja ili svojstva. Pristupne metode get i set ne mogu da imaju parametre niti možete da deklarišete properti kao konstantu. Podatak koji se dodeljuje propertiju se automatski prosleđuje pristupnoj metodi set koristeći uvek promenjivu koja se zove value. Ona ne može imati drugi naziv.

Kako se prave propertiji u kodu?


Da bi ste što lakše shvatili propertije, pogledajte kod programa Properties koji ima jednu klasu Person u kojoj su predstavljeni sve 3 vrste propertija.

namespace Properties
{
    class Person
    {
        // public property for read and write
        private string firstName;

        public string FirstName
        {
            get
            {
                return firstName;

            }
            set
            {
                firstName = value;

            }
        }

        // public auto property for read and write
        public string LastName { get; set; }

        // public property only for write
        private string password;
        public string Password
        {
            set
            {
                password = value;

            }
        }

        // public property only for read
        private string fullName;
        public string FullName
        {
            get
            {
                return fullName;
            }
        }

        // constructor
        public Person (string _firstName, string _lastName, string _password)
        {
            FirstName = _firstName;
            LastName = _lastName;
            Password = _password;

        }

        public void Print()
        {
            Console.WriteLine(Environment.NewLine + "Your name is: " + FirstName);
            Console.WriteLine("Your last name: " + LastName);
            fullName = FirstName + " " + LastName;

            Console.WriteLine("Your full name: " + FullName);

            string pass = password;

            if (pass.Trim() == "mypassword") Console.WriteLine("Password is correct!");
            else Console.WriteLine("Password is not correct!");

        }
    }
}

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

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

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

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

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

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

            do
            {
                Write("Your password: ");
                password = ReadLine();

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

            Person person = new Person(firstName, lastName, password);

            person.Print();

            ReadKey();

        }
    }
}

Klasa Person pored propertija sadrži konstruktor koji prihvata 3 argumenta i inicijalizuje vrednosti propertija. Properti FullName je properti samo za čitanje i njemu se vrednost ne može dodeliti eksplicitno. To uvek morate uradi implicitno preko metode. Properti Password je properti samo za pisanje i njegova se vrednost ne može ni proveriti ni menjati čak ni preko metode. Njena vrednost koja se ne može čitati se mora prvo dodeliti promenjivoj zatim promenjivu koristiti za manipulacije u programu. Kad pokrenete navedeni program rezultat će biti sličan u zavisnosti od vašeg unosa podataka.

Your first name: Manuel
Your last name: Radovanovic
Your password: mypassword

Your name is: Manuel
Your last name: Radovanovic
Your full name: Manuel Radovanovic
Password is correct!


Propertiji samo za pisanje se retko koriste u praksi. Mnogi iskusniji programeri savetuju kad se radi sa šiframa, posebno ako zahtevaju enkripciju ili deskripciju podataka; da je umesto propertija za samo pisanje bolje napraviti metodu nego koristiti properti samo za pisanje. Uvek koristite auto propertije gde god to možete i ako koristite C# od verzije 6.0 definišite defaultnu vrednost direktnim dodeljivanjem vrednosti auto propertiju; npr.

public int Quantity { get; set; } = 1;

Ovde je količina 1 defaulta vrednost, ukoliko korisnik ne unese količinu nekog artikla. Nadam se da shvatate poentu. Kako izgleda prethodni program možete pogledati i na video-u:



( C# 6.0 Tutorial - Fundamentals - 27. Properties )