FER / ZPR /  Ergonomija
Klase Svojstva
Za napredne
Handling and Throwing Exceptions je članak o rukovanju iznimkama. Svaka  pogreška koja se ne obradi unutar programskog koda nasilno zaustavlja vašu aplikaciju i zato treba pažljivo proučiti kako se obraniti od takvih slučajeva, te se pokušati i oporaviti u slučaju pogreške.

» Pročitaj članak

Metode

Metoda je blok koda koji sadrži niz naredbi. U C#-u, svaka izvršena instrukcija se nalazi u kontekstu metode.

Metode su deklarirane unutar klase ili strukture tako što su specificirani: nivo pristupa, povratna vrijednost, ime metode i parametri metode. Parametri su okruženi zagradama i razdvojeni zarezima. Prazne zagrade naznačuju da metoda ne zahtijeva nikakve parametre. Ova klasa ima tri metode:
class Motorcycle
{
    public void StartEngine() { }
    public void AddGas(int gallons) { }
    public int Drive(int miles, int speed) { return 0; }
}

Pozivanje metode

Pozivanje metode nekog objekta je slično pristupanju polju objekta. Nakon imena objekta stavi se točka, pa ime metode, te zagrade sa eventualnim parametrima:
Motorcycle moto = new Motorcycle();

moto.StartEngine();
moto.AddGas(15);
moto.Drive(5, 20);

Parametri vrijednosnog tipa

Kad predajemo varijablu vrijednosnog tipa metodi, zapravo predajemo kopiju varijable metodi. svaka promjena izvršena nad parametrom unutar metode neće imati nikakvog utjecaja na originalne podatke pohranjene u varijabli izvan metode. Ako želite pozvati metodu koja će promijeniti vrijednost parametra, tada je moramo prenijeti po referenci koristeći ref ili out ključne riječi. Sljedeći primjeri koriste ref.

Prvo ćemo predati parametar vrijednosnog tipa po vrijednosti. Svaka promjena unutar metode SquareIt neće imati utjecaja na varijablu n izvan metode.

class PassingValByVal
{
    static void SquareIt(int x)
    // The parameter x is passed by value.
    // Changes to x will not affect the original value of x.
    {
        x *= x;
        System.Console.WriteLine("The value inside: {0}", x);
    }
    static void Main()
    {
        int n = 5;
        System.Console.WriteLine("The value before: {0}", n);

        SquareIt(n);  // Passing the variable by value.
        System.Console.WriteLine("The value after: {0}", n);
    }
}
Rezultat je 5, 25, 5. Sljedeći primjer je skoro isti prethodnome, ali ovaj put varijablu predajemo po referenci:
class PassingValByRef
{
    static void SquareIt(ref int x)
    // The parameter x is passed by reference.
    // Changes to x will affect the original value of x.
    {
        x *= x;
        System.Console.WriteLine("The value inside: {0}", x);
    }
    static void Main()
    {
        int n = 5;
        System.Console.WriteLine("The value before: {0}", n);

        SquareIt(ref n); // Passing the variable by reference.
        System.Console.WriteLine("The value after: {0}", n);
    }
}
Ovaj put je rezultat 5, 25, 25.

Parametri referentnog tipa

Varijabla referentnog tipa ne sadrži podatke direktno, već sadrži referencu na podatke. Kada predamo parametar referentnog tipa po vrijednosti, moguće je promijeniti podatke na koje pokazuje referenca, ali ne možemo promijeniti vrijednost reference same. Unutar metode možemo stvoriti novi objekt i referencu preusmjeriti na njega, ali to će trajati koliko i metoda. Izvan metode, referenca će opet pokazivati na stari objekt. Da bi promijenili moramo koristiti ref ili out ključne riječi.

Prvo ćemo demonstrirati predavanje parametra referentnog tipa po vrijednosti. Budući da je parametar referenca na niz, elemente niza je moguće mijenjati, ali ne možemo parametar postaviti da pokazuje na drugu memorijsku lokaciju, tj. barem ne izvan metode.
class PassingRefByVal 
{
    static void Change(int[] pArray)
    {
        pArray[0] = 888; // This affects the original element
        pArray = new int[5] {-3, -1, -2, -3, -4}; // Local change
        System.Console.WriteLine("Inside the method, 
        	the first element is: {0}", pArray[0]);
    }

    static void Main() 
    {
        int[] arr = {1, 4, 5};
        System.Console.WriteLine("Inside Main, before calling 
        	the method, the first element is: {0}", arr [0]);

        Change(arr);
        System.Console.WriteLine("Inside Main, after calling 
        	the method, the first element is: {0}", arr [0]);
    }
}
Promjene nisu trajne zato što se zapravo metodi predaje kopija reference kad ne koristimo ključnu riječ ref. Kopija se mijenja unutar metode, ali original ostaje isti.

Kad koristimo ref, realokacija niza postaje trajna:
class PassingRefByRef 
{
    static void Change(ref int[] pArray)
    {
        // Both of the following changes will affect 
        // the original variables:
        pArray[0] = 888;
        pArray = new int[5] {-3, -1, -2, -3, -4};
        System.Console.WriteLine("Inside the method, 
        	the first element is: {0}", pArray[0]);
    }
        
    static void Main() 
    {
        int[] arr = {1, 4, 5};
        System.Console.WriteLine("Inside Main, before calling 
        	the method, the first element is: {0}", arr[0]);

        Change(ref arr);
        System.Console.WriteLine("Inside Main, after calling 
        	the method, the first element is: {0}", arr[0]);
    }
}

Konstruktori

Konstruktori su metode klase koje se izvršavaju kada se neki objekt stvori. Konstruktori imaju isto ime kao i klasa i obično se koriste za inicijalizaciju podatkovnih članova novog objekta.

U sljedećem primjeru klasa ima definiran jednostavni konstruktor. Nakon toga, klasa se instancira pomoću new operatora. Konstruktor je pozvan od new operatora odmah nakon alokacije memorije za novi objekt.
public class Taxi
{
    public bool isInitialized;
    public Taxi()
    {
        isInitialized = true;
    }
}

class TestTaxi
{
    static void Main()
    {
        Taxi t = new Taxi();
        System.Console.WriteLine(t.isInitialized);
    }
}
Konstruktor koji ne prima nikakve parametre zove se default konstruktor. Oni se pozivaju kad god je objekt instanciran pomoću new operatora bez ikakvih proslijeđenih argumenata. Osim ako klasa nije static, klase bez konstruktora dobivaju public default konstruktor od C# kompajlera. On postavlja podatkovne članove na njihove default vrijednosti.

Ako ne želimo da se neka klasa instancira, možemo postaviti konstruktor da bude private. To nam može koristiti ako npr. klasa ima samo static članove i instanciranje takve klase nema smisla.

class NLog
{
    // Private Constructor:
    private NLog() { }

    public static double e = System.Math.E;  //2.71828...
}
Konstruktori mogu primati parametre i takvi se mogu pozivati pomoću new izraza ili base izraza. Klase mogu imati i više konstruktora i ne moraju obavezno imati default konstruktor:
public class Employee
{
    public int salary;

    public Employee(int annualSalary)
    {
        salary = annualSalary;
    }

    public Employee(int weeklySalary, int numberOfWeeks)
    {
        salary = weeklySalary * numberOfWeeks;
    }
}
Sada klasa može biti instancirana na dva načina:
Employee e1 = new Employee(30000);
Employee e2 = new Employee(500, 52);
Konstruktor može korstiti base ključnu riječ da pozove konstruktor bazne klase:
public class Manager : Employee
{
    public Manager(int annualSalary)
        : base(annualSalary)
    {
        //Add further instructions here.
    }
}
U ovom slučaju, konstruktor bazne klase se poziva prije nego što se počeo izvršavati blok naredbi ovog konstruktora. Bilo koji parametar koji je predan konstruktoru se može koristiti kao parametar za base.

U izvedenoj klasi, ako konstruktor bazne klase nije eksplicitno pozvan pomoću base, onda se automatski poziva default konstruktor, ako postoji. To znači da su ove dvije deklaracije konstruktora iste:
public Manager(int initialdata)
{
    //Add further instructions here.
}

public Manager(int initialdata) : base()
{
    //Add further instructions here.
}
Ako bazna klasa nema default konstruktor, izvedena klasa mora eksplicitno pozvati bazni konstruktor sa base.

Konstruktor može pozvati drugi konstruktor istog objekta pomoću ključne riječi this. Kao i base, this se može zvati sa i bez parametara, i svi parametri koji predani konstruktoru se mogu predati i drugom konstruktoru kojeg zovemo sa this. Prvi konstruktor zove drugoga u sljedećem primjeru:
public Employee(int weeklySalary, int numberOfWeeks)
    : this(weeklySalary * numberOfWeeks)
{
}
public Employee(int annualSalary)
{
    salary = annualSalary;
}

na vrh

Klase Svojstva

 
Copyright © 2006, Mario Bošnjak