Zie Scherp Scherper - Hoofdstuk 12
Na dit hoofdstuk kan je:
een array van objecten aanmaken en de null-valkuil vermijden
werken met de List<>-collectie als “array on steroids”
een foreach-loop gebruiken (en zijn beperkingen kennen)
het var-keyword correct inzetten
de collecties Queue, Stack en Dictionary kiezen waar ze passen
Belangrijk
new maakt enkel de array aan. Er staan nog geen objecten in: alle elementen zijn null.
Een lege array van referenties.
Denk aan een object-array als een parkeerterrein:
new Student[20]
schildert de witte vakken
(de 20 plekken)
maar er staat nog geen enkele auto (object)
elke plek is null
met new Student()
parkeer je telkens een auto in een vak
Tip
Daarom moet je na het aanmaken van de array nog elk object apart met new maken.
Waarschuwing
Een nog niet aangemaakt element (null) benaderen geeft een NullReferenceException. Check eventueel met mijnKlas[3]?.Naam.
Maak de objecten meteen aan; de compiler bepaalt de lengte:
Opmerking
jos is nu via twee wegen bereikbaar: via jos én via mijnKlas[2]. Zolang er één referentie is, ruimt de GC het object niet op.
Een List<> is een veiligere, krachtigere array
< > Tussen < > staat het type dat de lijst bevat
Geen begingrootte nodig: een list groeit mee
Add() voegt een element toe; object initializer syntax werkt ook hier.
Belangrijk
Een List werkt met Count, niet met Length.
Clear() Insert() RemoveAt() IndexOf() Sort() …
Belangrijk
IndexOf en Contains vergelijken bij objecten de referentie. Twee aparte objecten met dezelfde inhoud gelden dus als verschillend (tot je Equals overridet, hoofdstuk 13).
Tip
LINQ (later) laat je in één leesbare regel filteren of sorteren (“alle Pokémon met meer dan 100 HP”). Voorlopig doen we dat nog met loops.
Leesbaarder dan met arrays, en de lijst groeit en krimpt vanzelf.
Wil je alle elementen overlopen zonder index?
De iteration variable (meting) krijgt elk element om de beurt. Geen teller nodig, en werkt ook op een List.
De iteration variable is read-only: je kan de array zelf niet wijzigen
Enkel als je alle elementen wil (anders een andere loop)
Geen teller beschikbaar; maak die zelf als je hem nodig hebt
Belangrijk
Read-only slaat op de referentie. Het object zelf mag je wél aanpassen: student.Geboortejaar++; mag, student = new Student(); niet.
Waarschuwing
Wil je tijdens het doorlopen verwijderen, gebruik dan een gewone for-loop van achter naar voor.
var laat de compiler het type afleiden uit de rechterkant:
Tip
In C# is dit puur lazy syntax: het type ligt nog steeds vast (statically typed). Anders dan in JavaScript, waar var een echt variabel type betekent.
Enqueue zet achteraan bij, Dequeue haalt vooraan af. Net als de rij aan de kassa.
Push legt bovenop, Pop neemt bovenaf. Net als een stapel papier.
Elk element heeft een unieke key en een value:
Tip
Opzoeken via de key gaat razendsnel, ongeacht de grootte. Veel sneller dan zoeken in een List.
Elk item heeft een .Key en een .Value van de types die je bij de declaratie koos.
Belangrijk
Gebruik voorlopig een eenvoudig type (int, string) als key. Een eigen klasse als key vereist Equals en GetHashCode (hoofdstuk 13).
Een quizspel waarin elke collectie precies de juiste rol speelt:
Queue
de vragenstapel (eerst gesteld, eerst aan de beurt)
Stack
de foute vragen (laatste fout bovenop)
Dictionary
de score per categorie (key = categorie)
List
alle gestelde vragen
Tip
De kunst is niet “ken alle collecties”, maar kies de juiste voor het probleem. FIFO? Queue. Opzoeken via een sleutel? Dictionary.
Een array van objecten start vol null: maak elk object eerst met new
Een List<> groeit mee, werkt met Count en vol handige methoden
foreach overloopt alle elementen leesbaar, maar de iteration variable is read-only
var laat de compiler het type afleiden (C# blijft statically typed)
Queue (FIFO), Stack (LIFO) en Dictionary (key-value) voor speciale gevallen
Tip
Volgende halte: overerving, waar klassen eigenschappen en gedrag van elkaar erven.
Kennisclips
Hoe doen andere programmeertalen hetzelfde?
Een handige samenvattende poster (Opgelet: gemaakt m.b.v. ChatGPT Image Gen 2).