10. Rad sa memorijom: reference, dinamički objekti - pr.sa časa
Rad sa memorijom u C#-u
C# memoriju deli na dve posebne oblasti, za dve različite namene:
-
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.
-
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);
|
**** 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); |