Zie Scherp Scherper - Hoofdstuk 12
Na dit hoofdstuk kan je:
null-valkuil vermijdenList<>-collectie als “array on steroids”foreach-loop gebruiken (en zijn beperkingen kennen)var-keyword correct inzettenQueue, Stack en Dictionary kiezen waar ze passenBelangrijk
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)nullnew Student() parkeer je telkens een auto in een vakTip
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.
List<> is een veiligere, krachtigere array< > staat het type dat de lijst bevatAdd() 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.
Belangrijk
Read-only slaat op de referentie. Het object zelf mag je wél aanpassen: student.Geboortejaar++; mag, student = new Student(); niet.
Waarschuwing
“Collection was modified; enumeration operation may not execute.” 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.
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:
| Collectie | Rol in de quiz |
|---|---|
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.
null: maak elk object eerst met newList<> groeit mee, werkt met Count en vol handige methodenforeach overloopt alle elementen leesbaar, maar de iteration variable is read-onlyvar laat de compiler het type afleiden (C# blijft statically typed)Queue (FIFO), Stack (LIFO) en Dictionary (key-value) voor speciale gevallenTip
Volgende halte: overerving, waar klassen eigenschappen en gedrag van elkaar erven.
Kennisclips
Dezelfde concepten uit dit hoofdstuk, maar dan in andere talen. Handig om later code in Python of JavaScript te leren lezen.
In Python is een list ingebouwd en typeloos:
In Java lijkt het sterk op C#: ArrayList<String> met .add(...).
In Python schrijf je net hetzelfde idee, zonder type en accolades:
In JavaScript heet dit for...of:
In Python heet dit een dict, ingebouwd met een handige {}-syntax:
In JavaScript gebruik je een Map met set en get:
Een handige samenvattende poster (Opgelet: gemaakt m.b.v. ChatGPT Image Gen 2).