C# – hukommelse og hukommelsesmodel

Value types, reference types, Stack, Managed Heap og Garbage Collector

Den vigtigste forskel

Value type Reference type
Indeholder selve værdien.
Ved almindelig tildeling kopieres værdien.

int, double, bool, char, decimal, struct, enum, tuples.
Indeholder en reference til et objekt.
Ved almindelig tildeling kopieres referencen – ikke objektet.

string, class, arrays, object, interface, delegates, records.

Tildeling med =

int a = 2;
int b = a;       // værdien kopieres
b = 5;           // a er stadig 2

string s1 = "Hej";
string s2 = s1;  // referencen kopieres
Husk: To reference-variable kan pege på det samme objekt.

Hvad ligger hvor?

Begreb Huske-model
Value type Indeholder data direkte.
Reference type Indeholder en reference; objektet allokeres på Managed Heap.
Lokale variable Typisk på Stack – men placeringen er en implementationdetalje.
Objekter Reference-type objekter allokeres på Managed Heap.
Stack Metodekald og lokale data i den simple model.
Heap Område som .NET-runtime og GC administrerer.

Null

string text;       // reference uden objekt
text = null;       // peger ikke på noget
text = "Hej";      // peger nu på et string-objekt
For reference types betyder null, at referencen ikke peger på et objekt.

Garbage Collector

  • .NET bruger automatisk hukommelsesstyring.
  • GC finder objekter, som ikke længere kan nås.
  • De kan derefter frigives og hukommelsen genbruges.
  • Du bruger normalt ikke free eller delete i C#.

Stack og Managed Heap

Vigtigt: Figuren er en model. Stack og heap er ikke to faste fysiske RAM-områder, og de skal ikke læres som to områder, der nødvendigvis vokser mod hinanden.

Stack – enkel model

  • Et metodekald får et stack frame.
  • Lokale variable og parametre hører til i modellen.
  • Når metoden returnerer, fjernes dens frame.
  • Det giver en naturlig LIFO-struktur.
static void Test()
{
    int a = 2;
    double b = 3.14;
} // kaldets stack frame fjernes

Heap – tænk ikke "én bunke"

Managed Heap er et hukommelsesområde, som .NET-runtime administrerer. Objekter kan flyttes af Garbage Collector, og heapen kan udvides efter behov.

Heap ≠ alle reference-variable. En reference-variabel indeholder referencen; objektet ligger på heapen. Et value type kan desuden ligge inde i et objekt på heapen.

Boxing

int number = 42;
object boxed = number;   // boxing
Her oprettes et objekt på heapen, værdien kopieres ind i objektet, og boxed refererer til det.

Huske-regler

  • Value type: variablen indeholder værdien.
  • Reference type: variablen indeholder en reference.
  • =: kopierer værdi eller reference.
  • null: reference peger ikke på et objekt.
  • GC: rydder automatisk op i utilgængelige objekter.
  • Value ≠ altid Stack og reference ≠ variable på Heap – det er kun huskemodeller.

Én sætning

En value type har sin værdi direkte, mens en reference type har en reference til sit objekt – og .NET håndterer objekternes hukommelse på Managed Heap automatisk.