Arvo- ja viittaustyypit

Tietotyypit voidaan jakaa arvo- ja viittaustyyppeihin. Arvotyyppejä ovat numeeriset tyypit, bool, char, enum sekä struct. Viittaustyyppejä ovat string, object, class (luokat), interface (liittymät) ja delegate (delegaatit).

Arvotyypit

Arvotyypit sisältävät suoraan arvonsa ja ne varaavat muistinsa pinosta (stack).
Kun luodaan arvotyypin muuttuja ja sijoitetaan siihen arvo

int luku1 = 123;

näyttäisi muistissa tältä

Kun sijoitamme luku1:n muuttujaan luku2, vain sen arvo kopioidaan

int luku1 = 123;
int luku2 = luku1;

ja muistissa näyttäisi tältä

Kun luku1:n arvoa muutetaan se ei vaikuta luku2:een

int luku1 = 123;
int luku2 = luku1;

luku1 = 456;

Console.WriteLine(luku1); // 456
Console.WriteLine(luku2); // 123

Muistin tilanne

Viittaustyyppi

Viittaustyypit varaavat muistinsa keosta (heap) ja pino(stack) sisältää vain viittauksen keon muistiosoitteeseen.
Kun luomme instanssin luokasta (tällä kertaa StringBuilder)

StringBuilder sb1 = new StringBuilder("Hello");

näyttää muistissa tältä

Kun sb1 sijoitetaan sb2:een, kopioidaan sen viittaus

StringBuilder sb1 = new StringBuilder("Hello");
StringBuilder sb2 = sb1;

jolloin muistissa

Nyt kun muokkaamme sb1:stä, näkyy muutos myös sb2:ssa, koska ne viittaavat samaan paikkaan

StringBuilder sb1 = new StringBuilder("Hello");
StringBuilder sb2 = sb1;
sb1.Append(" World!");

Console.WriteLine(sb1.ToString()); // Hello World!
Console.WriteLine(sb2.ToString()); // Hello World!

kuten muistista huomataan

u7x9cc0

Navigointi

Social Media