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