понедељак, 08. фебруар 2016.

Statičke klase, metode, konstruktori i promenjive u C# programskom jeziku



Kao što bi to Microsoft programeri rekli, statička klasa vam je u osnovi isto što i klasa koja nije statička ali sa tom razlikom što se statička klasa ne može instancirati. Drugim rečima, ne možete koristiti ključnu reč new za stvaranje promenjive tipa klase. Prva stvar koju treba da znate o statičkim klasama je da ih nikad ne pravite iako samo pretpostavljate da će se klasa nasleđivati. Statičke klase ne možete nasleđivati i jednostavno se podrazumeva da je svaka statička klasa i sealed klasa i bez korišćenja ključne reči sealed. Znači statičku klasu pravite samo ako ste sigurni da se nikad klasa koju pravite neće nasleđivati.  


( Statički članovi štede memoriju prilikom svake inicijalizacije klase )


Statičke klase se jednostavno prave umetanjem ključne reči static ispred ključne reči class prilikom pravljenja klase, ali i svaka statična klasa mora da sadrži samo statičke članove. U Visual Basic-u se umesto static koristi ključna reč Shared i često će te čuti Visual Basic programere da statičku klasu zovu deljena klasa ili statičku metodu zovu deljena metoda, što statičke klase i jesu. Samo to nemojte da mešate sa partial klasama koje dele klasu u više fajlova. Kad kažu za statičku klase da je deljena klasa misli se na deljene memorijski resursa jer statički članovi štede memoriju. Pogledajte inicijalizaciju klase koja nije statična kroz objekat klase.

Rectangle rectangle = new Rectangle();
WriteLine(rectangle.CalculateArea(5, 7));
WriteLine(rectangle.CalculateArea(8, 9));

Vi pozivate metodu CalculateArea preko objekta. Međutim dovoljno je samo metodu napraviti statičnu i jednostavno je pozivate preko klase.

Rectangle rectangle = new Rectangle();
WriteLine(Rectangle.CalculateArea(5, 7));
WriteLine(Rectangle.CalculateArea(8, 9));

Ukoliko je klasa statična, onda ne morate ni praviti inicijalizaciju objekta.

WriteLine(Rectangle.CalculateArea(5, 7));
WriteLine(Rectangle.CalculateArea(8, 9));

Ako imenujete namespace kao statičan, npr:

using static StaticClass.Rectangle; // StaticClass je ime programa

Tada možete pisati još kraće kod.

WriteLine(CalculateArea(5, 7));
WriteLine(CalculateArea(8, 9));

Razumevanje statičkog konstruktora


Kod statičkih klasa vaš konstruktor niti sme da ima parametre niti sme da bude javni što u neku ruku i ima smisla. Kad na primer napravimo promenjivu statičnom, tada istu možemo deliti u samoj klasi ali i u konstruktoru. Kao i svaki član čak i statički konstruktor koristi ključnu reč static. Konstruktor statičke klase može biti samo jedan i on se uvek implicitno poziva bez ključne reči new.

static double PI;

static Circle()
{
PI = Math.PI;

}

U navedenom kodu mi inicijalizujemo statičku promenjivu PI u statičkom konstruktoru. Koliko god sada da napravite metoda u istoj klasi koje koriste promenjivu PI, oni će deliti istu vrednost promenjive PI. Znači statična promenjiva postaje deljena u celoj klasi. Da promenjiva nije statična, da pravi kopiju same sebe u memoriji u svim primercima klase, trošili bi nepotrebno memoriju. Statičke promenjive takođe možete posmatrati kao globalne promenjive koje se koriste u starim programskim jezicima poput programskog jezika C. Opet trebate biti obazrivi prilikom korišćenja statični promenjivi jer se njihova vrednost može menjati sa više mesta programa što može dovesti do neočekivani rezultata. Ukoliko imate potrebu na primer da pravite vaš PI u smislu matematičke konstante; iako za tim nikada nećete imati potrebe jer se matematička konstanta nalazi u statičnoj klasi Math i svugde vam je dostupna; moja preporuka vam je da umesto statičke promenjive koristite programersku konstantu jer se tada vrednost PI ne može menjati. Ovde se PI koristi na način statične promenjive samo radi prezentacije statičkog polja. Pogledajte demonstrativni program StaticClass i obratite pažnju na kod:

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

namespace StaticClass
{
    class Rectangle
    {
        public static int CalculateArea(int width, int height)
        {
            return width * height;

        }
    }
}

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

namespace StaticClass
{
    // static class
    public static class Circle
    {
        // static member
        static double PI;

        // static constructor must be no public and parameterless
        static Circle()
        {
            PI = Math.PI;

        }

        // static method
        public static double CalculateArea(double radius)
        {
            return PI * radius * radius;

        }

    }
}

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

namespace StaticClass
{
    class Program
    {
        static void Main(string[] args)
        {
           
            WriteLine("No static class with a static method: " + Environment.NewLine);

            Rectangle rectangle = new Rectangle();
           
            WriteLine("Calculate rectangle area for 5 and 7 meters: " + Rectangle.CalculateArea(5, 7));
            WriteLine("Calculate rectangle area for 8 and 9 meters: " + Rectangle.CalculateArea(8, 9));

            WriteLine( Environment.NewLine + new String('-', 20) + Environment.NewLine);

            WriteLine("Static class:" + Environment.NewLine);
                       
            WriteLine("Calculate circle area for 5.45 radius: " + CalculateArea(5.45));
            WriteLine("Calculate circle area for 7.56 radius: " + CalculateArea(7.56));

            ReadKey();

        }
    }
}

Kad pokrenete program, rezultat će biti sledeći:

No static class with a static method:

Calculate rectangle area for 5 and 7 meters: 35
Calculate rectangle area for 8 and 9 meters: 72 


--------------------

Static class:

Calculate circle area for 5.45 radius: 93.3131557932508
Calculate circle area for 7.56 radius: 179.55332988621


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


( C# 6.0 Tutorial - Fundamentals - 37. Static Class, Constructor, Method and Variable )