Rad sa memorijom u C#-u

C# memoriju deli na dve posebne oblasti, za dve različite namene:

  1. Stack je namenjen za statičke podatke u kome se smeštaju lokalne promenljive kao i parametri nakon poziva metode. Po završetku metode Stack se oslobađa ovih podataka.

  2. Kada se kreira objekat operatorom new podaci za objekat se uvek smeštaju na Heap (dinamički podaci). Na taj objekat mogu da pokazuju više pokazivača iz statičke memorije.

Najbitniji pokazivački tip u .NET-u je klasa Object, a ključna reč object je alijas za System.Object. Koristi se za kreiranje promenljivih koje mogu da pokazuju na bilo koji tip.


ref & out parametri

Kreiranje ref parametara

Ukoliko koristite ref ključnu reč, C# kompajler će generisati kod koji prosleđuje referencu (adresu) stvarnog argumenta, umesto kopije argumenta. Kada koristite ref parametar, sve što radite sa parametrom će se odnositi i na originalni argument.

Primer:

1
2
3
4
5
6
7
8
9
10
11
static void doIncrement(ref int param)
{
    param++;
}
 
static void Main()
{
    int arg = 42;
    doIncrement(ref arg);
    Console.WriteLine(arg); 
// Prikazuje 43
}


****  gradivo ispod pročitajte kod kuće: biće obrađeno drugi put na času vežbi ***

Kreiranje out parametara

Postoje situacije u kojima je potrebno da se u metodi inicijalizuje vrednost parametra. To se postiže uz pomoć out ključne reči.
Argument out sličan je argumentu ref, osim što:
• ne mora imati dodeljenu vrednost pre ulaska u funkciju
• mora imati dodeljenu vrednost pre nego što se vrati iz funkcije
Modifikator out se najčešće koristi da bi se kao rezultat metode dobilo više izlaznih vrednosti.

Primer:

1
2
3
4
5
6
7
8
9
10
11
static void doInitialize(out int param)
{
    param = 42;
}
 
static void Main()
{
    int arg;
    doInitialize(out arg);
    Console.WriteLine(arg); // Prikazuje 42
}

Modifikator params
Modifikator params može se zadati uz poslednji parametar metode, tako da ona prihvata proizvoljan broj parametara određenog tipa. Tip parametra se mora deklarisati kao niz. Na primer:

1
2
3
4
5
6
static int Sum (params int[] ints)
{
int sum = 0;
for (int i = 0; i < ints.Length; i++) sum += ints[i];
return sum;
}

Evo kako će izgledati poziv:

1
Console.WriteLine (Sum (1, 2, 3, 4)); // 10


Argument s modifikatorom params možete proslediti i kao običan niz. Prethodni poziv je semantički ekvivalentan sledećem:

1
Console.WriteLine (new int[] { 1, 2, 3, 4 } );

Imenovani argumenti
Umesto da identifikujete argument po položaju, možete ga identifikovati po imenu. Na primer:

1
2
3
4
5
6
7
void Foo (int x, int y)
{
Console.WriteLine (x + “, “ + y);
}
void Test()
{
Foo (x:1, y:2); // 1, 2}

Imenovani argumenti mogu biti navedeni bilo kojim redosledom. Naredni pozivi funkcije Foo semantički su identični:

1
2
Foo (x:1, y:2);
Foo (y:2, x:1);



Last modified: Saturday, 5 October 2019, 8:51 AM