n00b pro

06. .NET Classes

Dit hoofdstuk is onderdeel van de cursus C#. Andere cursussen in dezelfde reeks: HTML, CSS, Javascript, Ontwikkelomgeving.

Op Youtube: objecten & strings

Overzicht

Klasse Omschrijving
BitmapImage in-memory afbeelding
Brushes bevat een aantal voorgedefinieerde kleuren
Clipboard geeft toegang tot het Window-klembord
Color werken met RGB-kleuren
Console basis I/O via de console
Convert omzetten (converteren) tussen verschillende datatypes
DispatcherTimer een timer waarmee je op vaste momenten een methode kan uitvoeren
Environment geeft toegang tot de omgeving waarin de applicatie wordt uitgevoerd
Math bevat wiskundige methodes en constanten
MediaPlayer tonen van dialoogvensters
MessageBox tonen van dialoogvensters
Random genereren van willekeurige waarden (getallen)
Stopwatch een timer waarmee je een tijdsspanne kan meten
SoundPlayer mp3 afspelen
SystemSounds windows geluiden afspelen
String werken met tekst

Audio en video

Overzicht

Er zijn verschillende klassen waarmee je media kan afspelen in .NET:

Klasse Te gebruiken voor Console? WPF? Opmerking
System.Media.SystemSounds Windows-sounds enkel .NET Framework ja  
System.Media.SoundPlayer audio (enkel .wav) enkel .NET Framework ja  
System.Media.MediaPlayer audio (meeste formaten) nee ja  
WMPLib.WindowsMediaPlayer audio (meeste formaten) ja ja referentie naar WMP library nodig
System.Windows.Controls.MediaElement video (meeste formaten) nee ja dit is een WPF control, dus makkelijk te integreren in WPF toepassingen

De meest flexibele oplossing is dus gebruik maken van een externe bibliotheek als WMPLib.

Media toevoegen aan je project

Om media toe te voegen, volg deze stappen:

  1. maak een map aan in je project voor de media bestanden via Add, New Folder...
  2. drag drop de media bestanden in deze map uit verkenner
  3. selecteer bij de properties voor elk media bestand bij Build Action Content en bij Copy to Output Directory Copy always:

Code voorbeelden

Windows sound afspelen

Windows heeft een heel aantal ingebouwde geluidseffecten, die je vrij kan gebruiken in je .NET projecten. De syntax is eenvoudig (zie ook https://www.wpf-tutorial.com/audio-video/playing-audio/):

...
using System.Media;

...
// play the Asterisk Windows sound effet
SystemSounds.Asterisk.Play();

.wav file afspelen met SoundPlayer

Behalve starten en stoppen van geluiden biedt SoundPlayer weinig functionaliteit; volume regelen of pauzeren b.v. kan niet.
Schematisch codefragment:

...
using System.Media;

...
string path = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "sounds/test.wav");
SoundPlayer player = new SoundPlayer(path);
player.Load(); // wacht tot het geluid ingeladen is
player.PlaySync(); // PlaySync(): wacht met uitvoeren van de rest van de code tot het geluid afgespeeld is
                   // Play(): speel het geluid af en ga ondertussen verder met de rest van de code
...
player.Stop(); // stop het geluid voortijdig

Geluid afspelen met MediaPlayer

Dit is een prima klasse om geluiden af te spelen in WPF toepassingen, met veel functionaliteit als starten, pauzeren, stoppen, volume, balans, detecteren wanneer het geluid gestopt is enz... In Console toepassingen werkt het evenwel niet; daar gebruik je best de Windows Media Player library (zie volgend onderdeel). Let er op dat Windows Media Player ingeschakeld is in Windows:

Schematisch codefragment:

...
using using System.Windows.Media;

...
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.MediaEnded += MediaPlayer_MediaEnded;
mediaPlayer.Open(new Uri("Music/some-song.mp3", UriKind.Relative));
mediaPlayer.Play();

// callback method when media has finished playing
private void MediaPlayer_MediaEnded(object? sender, EventArgs e)
{
   MessageBox.Show("song has finished");
}

Andere methodes en properties die je kan gebruiken:

mediaPlayer.Pause(); // pauzeer
mediaPlayer.Stop(); // stop
mediaPlayer.Balance = -1; // enkel linkerspeaker
mediaPlayer.Position = new TimeSpan(0, 0, 0, 30); // stel speelpositie in op 30s
mediaPlayer.SpeedRatio = 1.5; // speel 50% sneller
mediaPlayer.Volume = 0.5; // zet volume op 50%

Geluid afspelen met Windows Media Player library

Met de Windows Media Player-library kan je een brede waaier aan audioformaten afspelen in WPF én Console apps. Het bevat functionaliteit om liedjes te starten, pauzeren, het volume te regelen, etc. Let er weer op dat Windows Media Player ingeschakeld is in Windows:

Eerst moet je een referentie naar de library toevoegen aan je project. Dit kan in de Solution Explorer met de rechtermuisknop, “Add Reference...”:

Selecteer onder “COM” in de lijst “Windows Media Player”, en klik OK:

Codefragment (let op de using WPMLib bovenaan):

...
using WMPLib;

...
WMPLib.WindowsMediaPlayer wmPlayer = new WMPLib.WindowsMediaPlayer();
wmPlayer.URL = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "sounds/music.mp3");
wmPlayer.controls.play();

Andere methodes en properties die je kan gebruiken:

wmPlayer.controls.pause(); // pauzeer
wmPlayer.controls.stop(); // stop
wmPlayer.settings.volume = 50; // zet volume op 50%
wmPlayer.settings.mute = true; // muten

Video afspelen met MediaElement WPF control

zie MediaElement WPF control

BitmapImage

Een BitmapImage is een klasse die een in-memory afbeelding voorstelt. Je kunt het gebruiken om een afbeeldingsbestand in te laden en vervolgens weer te geven in een WPF Image-control (zie voorbeeld-code hieronder).

De klasse BitmapImage bevindt zich in de namespace System.Windows.Media.Imaging. Je dient deze namespace dus eerst te importeren (m.b.v. een using-statement), alvorens je deze klasse kunt gebruiken in je code:

using System.Windows.Media.Imaging;

//... rest van je code

Constructie

new BitmapImage(Uri resource);

Code voorbeeld

Afbeelding inladen en weergeven in WPF Image-control:

Uri bitmapSource = new Uri("img/06_dotnetclasses/photo1.jpg", UriKind.Relative); // bestand: img/06_dotnetclasses/photo1.jpg
wpfImage.Source = new BitmapImage(bitmapSource);

Brushes

Een klasse die een aantal Brush-properties bevat die standaardkleuren voorstellen (bv.: Aqua, Blue, Green, ...). Voor een volledig overzicht van alle beschikbare kleuren, zie de documentatie.

Voorbeeld

Instellen van voor- en achtergrondkleur TextBlock-control:

txtHello.Foreground = Brushes.DarkBlue; // donker blauwe tekstkleur
txtHello.Background = Brushes.LightYellow; // licht gele achtergrondkleur
voorbeeld brushes
resultaat van instellen Foreground en Background

Opmerking: voor algemenere manieren om kleuren te definiëren zie de Color klasse

Clipboard

De klasse Clipboard geeft je toegang tot het klembord van Windows (wordt gebruik bij copy-paste van gegevens).

Methodes

Methode Omschrijving
SetText() Plaatst de meegegeven tekst op het klembord van de gebruiker
GetText() Vraagt de huidige (tekstuele) waarde van het klembord op

Voorbeelden

Tekst op het klembord plaatsen

Clipboard.SetText("text to be copied");

Tekstuele inhoud van het klembord opvragen

string content = Clipboard.GetText();

Collectie classes

Een collectie is een verzameling gegevens van hetzelfde type met één naam.

Enkele voorbeelden van collecties:

Belangrijk: je kan geen verschillende types (bv. getallen en teksten) mixen in één collectie!
Er bestond vroeger wel een ArrayList waar dat wel mocht, maar dat is slechte stijl en het wordt dan ook niet meer gebruikt.

Alle klassen (behalve Array) zitten in de System.Collections.Generic namespace. Om ze te kunnen gebruiken, moet je dus een using toevoegen:

using System;
using System.Collections.Generic;
...

Overzicht

Klasse Beschrijving Te vergelijken met
Array vaste lengte; wrapper class rond native C# arrays vaste stoelen in een wachtzaal
Dictionary<TKey, Tvalue> variabele lengte; key-value paren, met unieke keys lockers met naambordjes
HashSet<T> variabele lengte; lijst unieke waarden
List<T> variabele lengte; toevoegen of verwijderen items kan overal platenkast
Queue<T> variabele lengte; FIFO (first in, first out): toevoegen aan einde, verwijderen aan begin wachtrij aan de kassa
SortedDictionary<TKey, Tvalue> variabele lengte; als Dictionary, maar dan automatisch gesorteerd op TKey
Stack<T> variabele lengte, LIFO (last in, first out): toevoegen en verwijderen aan einde stapel pannenkoeken
in volgorde: Array, Dictionary, List, Queue en Stack

Array

Deze klasse wordt uitvoerig besproken in 05. Arrays

List<T>

Een List is een collectie van elementen van één bepaald type (string, int, double, ...). Het verschil met een gewone array is dat het aantal elementen onbepaald is.

Declaratie en initialisatie

Algemene syntax:

List<type> naamLijst = new List<type>(); // type is het type van de elementen in de collectie (int, double, string, ...)

Code voorbeelden:

List<int> getallen = new List<int>(); // een lijst van int's
List<bool> myList = new List<bool>(); // een lijst van bool's
List<string> namen = new List<string>(); // een lijst van string's

Je kan meteen een aantal beginwaarden meegeven:

List<int> getallen = new List<int>() { 5, 12, 7, 9, 3 };  // de lijst getallen bevat 5 elementen: 5, 12, 7, 9 en 3

Lijsten aanpassen

één element toevoegen

Je kunt individuele elementen toevoegen met de Add():

List<string> fruit = new List<string>(); // declaratie (nieuwe lijst van string's)
fruit.Add("appel"); // lijst bevat 1 element
fruit.Add("banaan"); // lijst bevat 2 elementen
fruit.Add("citroen"); // lijst bevat 3 elementen
lijsten samenvoegen

Je kan de elementen van een tweede lijst toevoegen met AddRange():

List<string> fruit = new List<string>() { "appel", "banaan", "citroen" }; // eerste lijst
List<string> nogmeerfruit = new List<string>() { "peer", "kiwi" }; // tweede lijst
fruit.AddRange(nogmeerfruit); // fruit is nu "appel", "banaan", "citroen", "peer", "kiwi"
element wijzigen

Elementen wijzigen doe je eenvoudig met een toewijzing (=). Code voorbeeld:

List<int> getallen = new List<int>() { 4, 8, 3 }; // lijst is 4, 8, 3
getallen[1] = 5; // tweede element wijzigen naar 5, lijst is nu: 4, 5, 3
één element verwijderen

Je kan een element verwijderen op basis van de waarde met Remove() (enkel de eerst gevonden waarde zal verwijderd worden):

List<int> getallen = new List<int>() {2, 5, 7, 5 }; // inhoud van de lijst: 2, 5, 7, 5
getallen.Remove(5); // verwijder element met waarde 5 (enkel eerste); inhoud van de lijst: 2, 7, 5

Je kan een element ook verwijderen op basis van de index met RemoveAt():

List<int> getallen = new List<int>() {2, 5, 7, 5 }; // inhoud van de lijst: 2, 5, 7, 5
getallen.RemoveAt(2); // verwijder het derde element; de lijst is nu 2, 5, 5
alle elementen verwijderen

Met de methode Clear(), kan je alle elementen uit de lijst verwijderen:

List<int> getallen = new List<int>() { 2, 5, 7, 5 }; // inhoud van de lijst: 2, 5, 7, 5
getallen.Clear(); // de lijst is nu leeg

Lijsten gebruiken

elementwaarde opvragen

Je kunt een element uit een lijst opvragen op basis van de index van het element, startend vanaf 0. Code voorbeeld:

List<string> kleuren = new List<string>() { "rood", "groen", "blauw" };
string eerste = kleuren[0]; // eerste element heeft index 0
Console.WriteLine($"Het eerste element is: {eerste}");
Console.WriteLine($"Het tweede element is: {kleuren[1]}");
string laatste = kleuren[kleuren.Count - 1]; // manier om laatste element op te vragen
Console.WriteLine($"Het laatste element is: {laatste}");
Het eerste element is: rood
Het tweede element is: groen
Het laatste element is: blauw
resultaat in de console
aantal elementen opvragen

Met de property Count kan je het aantal elementen dat op dat moment in de List zit opvragen:

List<int> getallen = new List<int>() { 2, 5, 8 };
Console.WriteLine(getallen.Count); // Count property
3
resultaat in de console

⚠️ voor arrays gebruik je Length, bij lijsten gebruik je Count

alle elementen overlopen met for-loop

Indien je de index (positie) van het element in de lijst nodig hebt.

List<string> namen = new List<string>() { "Zakaria", "Nelly", "Killian", "Chun" };

for (int i = 0; i < namen.Count; i++)
{
    string naam = namen[i];
    Console.WriteLine($"{i + 1}. {naam}");
}
1. Zakaria
2. Nelly
3. Killian
4. Chun
resultaat in de console
alle elementen overlopen met foreach-loop

Indien je de index (positie) van het element niet nodig hebt kan je foreach gebruiken:

List<string> namen = new List<string>() { "Zakaria", "Nelly", "Killian", "Chun" };

foreach (string naam in namen)
{
    Console.WriteLine(naam);
}
Zakaria
Nelly
Killian
Chun
resultaat in de console
nagaan of element voorkomt in lijst

Met de methode Contains() kan je nagaan of een element voorkomt in een lijst. De methode stuurt true terug indien de meegegeven waarde zich in de lijst bevindt:

List<string> fruit = new List<string>() { "appel", "banaan", "citroen" };

bool gevonden = fruit.Contains("citroen"); // ga na of het woord "citroen" in de lijst voorkomt
if (gevonden)
{
    Console.WriteLine("Het element komt wel in de lijst voor");
}
else
{
    Console.WriteLine("Het element komt niet in de lijst voor.");
}
Het element komt in de lijst voor
resultaat in de console
lijst sorteren

De methode Sort() sorteert de elementen in een lijst in oplopende volgorde (van klein naar groot, of voor tekst alfabetische van 'a' tot 'z'):

List<int> getallen = new List<int>() { 7, 3, 9, 5 };

getallen.Sort(); // sorteer de elementen in de lijst (volgorde van elementen in lijst zélf verandert!)
foreach (int getal in getallen)
{
    Console.WriteLine(getal);
}
3
5
7
9
resultaat in de console
elementen in een lijst samenvoegen tot één string

Gebruik string.Join() om elementen van een list samen te voegen tot één string. Het eerste argument is de "lijm" tussen elementen:

List<int> getallen = new List<int>() { 7, 3, 9, 5 };

Console.WriteLine(string.Join(" - ", getallen));
7 - 3 - 9 - 5
resultaat in de console

Lijsten vs arrays

Er zijn nogal wat syntactische verschillen. Een overzichtstabel:

Array List
lengte vast flexibel
declaratie int[] cijfers = new int[3]; List<int> cijfers = new List<int>();
initialisatie int[] cijfers = { 4, 1, 11 }; List<int> cijfers = new List<int>() { 4, 1, 11 };
elementen toevoegen/verwijderen niet mogelijk Add(), Remove(), RemoveAt(), Clear()
elementen lezen/schrijven cijfers[i] cijfers[i]
aantal elementen cijfers.Length cijfers.Count
sorteren Array.Sort(cijfers) cijfers.Sort()
bevat waarde cijfers.Contains(4) cijfers.Contains(4)
string splitten naar... string txt = "aap noot mies";
string[] woorden = txt.Split(' ');
niet mogelijk
samenvoegen string.Join(", ", cijfers) string.Join(", ", cijfers)

Vergelijkend voorbeeld met een aantal typische methodes:

string tekst = "aap noot mies";
string[] woorden = tekst.Split(' ');
Console.WriteLine($"deze tekst bevat {woorden.Length} woorden");
if (woorden.Contains("aap")) Console.WriteLine("de woorden bevatten \"aap\"");
Array.Sort(woorden);
Console.WriteLine($"de woorden, alfabetisch: {string.Join(" - ", woorden)}");
deze tekst bevat 3 woorden
de woorden bevatten "aap"
de woorden, alfabetisch: aap - mies - noot
resultaat in de console
List<int> cijfers = new List<int>();
cijfers.Add(7);
cijfers.Add(1);
cijfers.Add(-3);
Console.WriteLine($"deze lijst bevat {cijfers.Count} getallen");
if (cijfers.Contains(1)) Console.WriteLine("de lijst bevat de waarde 1");
cijfers.Sort();
Console.WriteLine($"cijfers (van laag naar hoog): {string.Join(", ", cijfers)}");
deze lijst bevat 3 getallen
de lijst bevat de waarde 1
cijfers (van laag naar hoog): -3, 1, 7
resultaat in de console
array of lijst?

Lijsten zijn zeker makkelijker in gebruik en flexibeler dan arrays. Arrays nemen dan weer een vaste geheugenruimte in, terwijl voor lijsten bij elke toevoeging nieuw geheugen moet gezocht worden, waardoor ze een stuk trager zijn. Dus:

Stack<T>

Een Stack<T> is als een List<T> maar dan zonder methodes Add() of Remove(), en in plaats daarvan Push() (plaats element op de stapel) en Pop() (pak een element van de stapel):

Stack<int> stack = new Stack<int>(new int[] { 4, 8, 11 });
int val1 = stack.Pop(); // 11
int val2 = stack.Pop(); // 8
stack.Push(23);
int val3 = stack.Pop(); // 23
int val4 = stack.Pop(); // 4
int val5 = stack.Pop(); // FOUT! stack is leeg

Queue<T>

Een Queue<T> is als een List<T> maar dan zonder methodes Add() of Remove(), en in plaats daarvan Enqueue() (plaats element achteraan de wachtrij) en Dequeue() (pak een element vooraan de wachtrij):

Queue<int> queue = new Queue<int>(new int[] { 4, 8, 11 });
int val1 = queue.Dequeue(); // 4
int val2 = queue.Dequeue(); // 8
queue.Enqueue(23);
int val3 = queue.Dequeue(); // 11
int val4 = queue.Dequeue(); // 23
int val5 = queue.Dequeue(); // FOUT! queue is leeg

HashSet<T>

Een HashSet<T> is hetzelfde als een List<T>, behalve dat de lijst uniek gehouden wordt:

HashSet<string> set = new HashSet<string>(new string[] { "banaan", "appel" });
set.Add("banaan");
set.Add("citroen");
set.Add("banaan");
set.Add("banaan");
set.Add("appel");
set.Add("appel");
set.Add("peer");
Console.WriteLine(string.Join(", ", set));
banaan, appel, citroen, peer
voorbeeldfragment HashSet<T>

Dictionary<TKey,Tvalue>

De Dictionary wordt gebruikt voor key-value paren, waarbij de keys uniek moeten zijn. De methodes en properties lijken sterk op List<T>. Voorbeeldfragment met typische methodes en properties:

Dictionary<string, int> dict1 = new Dictionary<string, int> { { "aap", 6 }, { "noot", 3 }, { "mies", -7 } };
dict1["tuin"] = 11; // voeg een nieuw key-value paar toe
dict1.Remove("mies"); // verwijder een key-value paar
dict1["noot"] = 4; // verander de waarde van ene key-value paar
Console.WriteLine($"Dictionary 1 bevat key \"noot\": {(dict1.Keys.Contains("noot") ? "ja" : "nee")}"); // controleer of key bestaat
Console.WriteLine($"Dictionary 1 bevat waarde 3: {(dict1.Values.Contains(3) ? "ja" : "nee")}"); // controleer of value bestaat
foreach (KeyValuePair<string, int> item in dict1)
{
    Console.WriteLine($"Key: {item.Key}, Value: {item.Value}");
}
Dictionary 1 bevat key "noot": ja
Dictionary 1 bevat waarde 3: ja
Key: aap, Value: 6
Key: noot, Value: 4
Key: tuin, Value: 11
voorbeeldfragment Dictionary<string,int>

LINQ extensie methodes

Linq biedt een aantal extensie methodes met de lambda expressie syntax voor collecties. Een greep uit het aanbod:

Methode Omschrijving Returntype
All() controleer of alle items aan een voorwaarde voldoen bool
Any() controleer of minstens één item aan een voorwaarde voldoet bool
Average() bepaal het gemiddelde van de items double
Count() tel het aantal items int
Distinct() verwijder alle dubbels IEnumerable
First() geef het eerste item; fout indien niet gevonden object
FirstOrDefault() geef het eerste item; standaardwaarde (null/0/...) indien niet gevonden object
Last() geef het laatste item; fout indien niet gevonden object
LastOrDefault() geef het laatste item; standaardwaarde (null/0/...) indien niet gevonden object
OrderBy() sorteer items op basis van een item waarde IEnumerable
Select() selecteer van elk item een waarde IEnumerable
Sum() bepaal de som van de items int/double
Take() neem de eerste n items IEnumerable
Where() filter items op basis van een voorwaarde IEnumerable

Voorbeelden met arrays:

string[] fruits = { "apple", "pear", "grape", "banana", "banana", "jackfruit", "banana" };
string[] fruitsLength5 = fruits.Where(f => f.Length == 5).ToArray(); // { "apple", "grape" }
int[] fruitLengths = fruits.Select(f => f.Length).ToArray(); // { 5, 4, 5, 6, 9 }
bool containsBanana = fruits.Any(f => f == "banana"); // true
int numBananas = fruits.Count(f => f == "banana"); // 3
string firstLength7 = fruits.FirstOrDefault(f => f.Length == 7); // null
string[] fruitsUnique = fruits.Distinct().ToArray(); // { "apple", "pear", "grape", "banana", "jackfruit" }
string[] fruitsFirst3 = fruits.Take(3).ToArray(); // { "apple", "pear", "grape" }
string[] fruitsByLength = fruits.Distinct().OrderBy(f => f.Length).ToArray(); // { "pear", "apple", "grape", "banana", "jackfruit" }

int[] numbers = { 3, 8, 1, 5, 10 };
double avg = numbers.Average(); // 5.4
int sum = numbers.Sum(); // 27
int lowest = numbers.Min() // 1
int first = numbers.First() // 3
int last = numbers.Last() // 10

Color

Deze klasse wordt gebruikt voor het werken met (RGB-)kleuren.

Methodes

Methode Omschrijving
FromRgb() Construeert een Color-object, op basis van de R-, G- en B-componenten van de kleur

Voorbeeld

Instellen van voor- en achtergrondkleur Button

Color tekstkleur = Color.FromRgb(227, 227, 227);
btnKlikHier.Foreground = new SolidColorBrush(tekstkleur);

Color achtergrondkleur = Color.FromRgb(11, 212, 21);
btnKlikHier.Background = new SolidColorBrush(achtergrondkleur);
color button
button met tekst- en achtergrondkleur

Console

Met de klasse Console is het mogelijk om tekst naar de console te schrijven en invoer van de gebruiker uit de console uit te lezen (basis I/O).

Properties en methodes

Property Omschrijving
BackgroundColor De achtergrondkleur die achter de tekst in de console wordt weergegeven
ForegroundColor De tekstkleur voor het weergeven van tekst in de console
OutputEncoding Het karakterset gebruikt in de console
Methode Omschrijving
Clear() Wist de inhoud van het console-venster
Read() Lees één karakter uit, uit de console
ReadKey() Leest één karakter uit, uit de console. Biedt de mogelijkheid om de ingetypte toets niet weer te geven
ReadLine() Leest een volledige regel uit, uit de console
ResetColor() Herstelt de voor- en achtergrondkleur naar de oorspronkelijke kleuren
Write() Schrijft de waarde naar de console
WriteLine() Schrijft de waarde naar de console en eindigt de regel met een newline-karakter

Waarde schrijven

Tekst schrijven op één regel

Console.Write("a");
Console.Write("b");
Console.Write("c");
abc
Write(): schrijf en blijf op dezelfde regel

Tekst schrijven over meerdere regels

Console.WriteLine("a");
Console.WriteLine("b");
Console.WriteLine("c");
a
b
c
WriteLine(): schrijf en ga naar de volgende regel

Waarde inlezen

Tekst inlezen en weergeven in de console

Console.Write("Voer je naam in: "); // vraag om de naam van de gebruiker (blijf op zelfde lijn)
string naam = Console.ReadLine();   // lees de naam in en sla deze op in een variabele

Console.WriteLine($"Hallo, {naam}"); // schrijf een boodschap naar de console
regel inlezen en weergeven
resultaat in de console

Getal inlezen

Console.ReadLine() geeft altijd een tekst terug; als je een getal wil, moet je het converteren met Convert.ToInt32() (gehele getallen) of Convert.ToDouble() (kommagetallen):

Console.Write("Geef een aantal in: ");
int aantal = Convert.ToInt32(Console.ReadLine());   // zet de tekst om naar een geheel getal met Convert.ToInt32()
Console.Write("Geef een prijs in: ");
double prijs = Convert.ToDouble(Console.ReadLine());   // zet de tekst om naar een kommagetal met Convert.ToInt32()

Karakter inlezen met weergave

Console.Write("Wil je verder gaan? [j/n]: ");
char keuze = Console.ReadKey().KeyChar;
Console.WriteLine($"\nJe koos: {keuze}");
resultaat in de console: het ingetikte karakter wordt weergegeven

Karakter inlezen zonder weergave

Console.Write("Wil je verder gaan? [j/n]: ");
char keuze = Console.ReadKey(true).KeyChar; // true → karakter wordt niet weergegeven in console
Console.WriteLine($"\nJe koos: {keuze}");
resultaat in de console het ingetikte karakter wordt niet weergegeven

Soms wordt dit ook gebruikt om met het vervolg van het programma te wachten tot de gebruiker een toets indrukt:

Console.WriteLine("druk een toets om verder te gaan...");
Console.ReadKey(true); 

Console kleuren

Met de properties ForegroundColor en BackgroundColor kan je de tekstkleur, respectievelijk de achtergrondkleur van de uitvoer in de console instellen.

Console.ForegroundColor = ConsoleColor.Red; // rode tekstkleur
Console.BackgroundColor = ConsoleColor.White; // witte achtergrond

Console.WriteLine("Hello, World!");
uitvoer console kleuren
resultaat console kleuren

Om opnieuw de oorspronkelijke tekst- en achtergrondkleur in te stellen, maak je gebruik van de methode ResetColor():

Console.ResetColor();

Console wissen

Om het console-venster leeg te maken, maak je gebruik van de Clear()-methode:

Console.Clear(); // wis de inhoud van het console-venster

Console karaktersets

Standaard kan je in de console alleen de eerste 127 ASCII karakters gebruiken (zie b.v. asciitable.com ). Andere karakters worden fout weergegeven:

Console.WriteLine("A 1 +"); // gewone ASCII karakters worden correct weergegeven
Console.WriteLine("∑ → ◈"); // andere karakters worden fout weergegeven
A 1 +
S ⸮ ?
speciale karakters worden fout weergegeven

Om speciale karakters correct weer te geven, moet je Console.OutputEncoding instellen:

Console.OutputEncoding = Encoding.UTF8; // stel utf-8 karakterset in
Console.WriteLine("A 1 +");
Console.WriteLine("∑ → ◈"); // andere karakters worden nu ook correct weergegeven
A 1 +
∑ → ◈
speciale karakters worden nu correct weergegeven

Merk op: zelfs dan kunnen karakters soms verkeerd of anders weergegeven worden, afhankelijk van de beschikbare lettertypes, en zeker bij emoji's.

Console.OutputEncoding = Encoding.UTF8;
Console.WriteLine("✂ ✍ ✈ ☀");
emoji's worden soms anders of verkeerd weergegeven

Convert

De klasse Convert wordt gebruikt om waarden van verschillende types om te zetten naar een ander data-type (bv.: van string naar int).

Methodes

Methode Omschrijving
ToChar() Zet een waarde om naar een waarde van het type char
ToDouble() Zet een waarde om naar een waarde van het type double
ToInt32() Zet een waarde om naar een waarde van het type int (32 bits)
ToString() Zet een waarde om naar een string
ToBoolean() Zet een waarde om naar een waarde van het type bool

Code voorbeelden

ToChar

char letter = Convert.ToChar("a"); // string naar char
char letter2 = Convert.ToChar(65); // int naar char (ASCII-waarde → 'A')

ToDouble

double kommagetal = Convert.ToDouble("3.14"); // string naar double

ToInt32

int a = Convert.ToInt32("15"); // string naar int
int b = Convert.ToInt32(3.14); // double naar int → afronding (b = 3)
int c = Convert.ToInt32(3.91); // double naar int → afronding (c = 4)

Opmerking: wanneer je een kommagetal (double) omzet naar een geheel getal (int), wordt het getal wiskundig afgerond (d.w.z. < 0.5 naar beneden, >= 0.5 naar boven)

ToString

string str1 = Convert.ToString('a');        // char → string "a"
string str2 = Convert.ToString(32);         // int → string "32"
string str3 = Convert.ToString(3.1415);     // double → string "3.1415"

DateTime

Deze klasse laat toe te werken met datum en tijd.

Aanmaken

Codevoorbeelden:

// enkel datum informatie: jaar, maand, dag
DateTime someDay = new DateTime(2024, 09, 25);

// datum & tijd informatie: jaar, maand, dag, uren, minuten, seconden
DateTime someDayAndTime = new DateTime(2024, 09, 25, 7, 45, 30);

// shortcut om de huidige datum toe te kennen, b.v. 2024-11-05 00:00:00
DateTime today = DateTime.Today;

// shortcut om de huidige datum én tijd toe te kennen, b.v. 2024-11-05 15:45:30.123
DateTime now = DateTime.Now;

Jaar, maand en andere eigenschappen

Codevoorbeelden:

DateTime now = DateTime.Now;
int year = now.Year;
int month = now.Month;
int day = now.Day;
int hour = now.Hour;
int minute = now.Minute;
int second = now.Second;
int weekDay = (int)now.DayOfWeek; // 0 = zondag, 1 = maandag...

Datum of tijd aanpassen

Positief argument telt bij, negatief argument trekt af:

DateTime now = DateTime.Now;
DateTime oneSecondLater = now.AddSeconds(1);
DateTime oneMinuteLater = now.AddMinutes(1);
DateTime oneHourLater = now.AddHours(1);
DateTime tomorrow = now.AddDays(1);
DateTime yesterday = now.AddDays(-1);
DateTime oneMonthLater = now.AddMonths(1);
DateTime oneYearLater = now.AddYears(1);
DateTime oneYearBefore = now.AddYears(-1);

DatumTijdsverschillen: TimeSpan

Verschillen tussen datumtijden leveren een TimeSpan instantie op:

DateTime start = new DateTime(2024, 10, 05, 10, 0, 0);
DateTime end = DateTime.Now;
TimeSpan difference = end - start;

// toon het verschil in dagen, uren en minuten
Console.WriteLine($"Het verschil is {difference.Days} dagen, {difference.Hours} uren en {difference.Minutes} minuten");

// toon het verschil in minuten
Console.WriteLine($"Het verschil uitgedrukt in minuten is {difference.TotalMinutes} minuten.");

Geformatteerde weergave

De omzetting naar een leesbare weergave kan met een format specifier, die je meegeeft met ToString():

DateTime todayAndNow = DateTime.Now;
Console.WriteLine($"Short date format: {todayAndNow.ToString("d")}");
Console.WriteLine($"Long date format: {todayAndNow.ToString("D")}");
Console.WriteLine($"Custom date format 1: {todayAndNow.ToString("dd/MM/yyyy")}");
Console.WriteLine($"Custom date format 2: {todayAndNow.ToString("dd/MM/yyyy hh:mm:ss")}");

Je kan het ook rechtstreeks in string interpolatie gebruiken:

Console.WriteLine($"Short date format (e.g. 25/09/24): {todayAndNow:d}");
Console.WriteLine($"Long date format (e.g. woensdag 25 september 2024): {todayAndNow:D}");
Console.WriteLine($"Custom date format 1 (e.g. 25/09/24): {todayAndNow:dd/MM/yyyy}");
Console.WriteLine($"Custom date format 2 (e.g. 25/09/2024 01:22:18): {todayAndNow:dd/MM/yyyy hh:mm:ss}");
Short date format: 25/11/2024
Long date format: maandag 25 november 2024
Custom date format 1: 25/11/2024
Custom date format 2: 25/11/2024 03:18:21
resultaat in de console

Voor een volledige lijst codes, zie b.v. https://www.c-sharpcorner.com/blogs/date-and-time-format-in-c-sharp-programming1

Environment

De klasse Environment biedt een aantal properties en methodes aan om informatie te verkrijgen over de omgeving waarin de applicatie wordt uitgevoerd (locale, besturingssysteem, ...).

Properties en methodes

Property Omschrijving
NewLine Newline-karakter voor het besturingssysteem waarop de applicatie wordt uitgevoerd
SpecialFolder.Desktop Pad naar de desktop op de huidige computer
SpecialFolder.MyDocuments Pad naar de documentenmap op de huidige computer
Methode Omschrijving
Exit Wordt gebruikt om de applicatie (voortijdig) af te sluiten

Code voorbeelden

Platform-onafhankelijke NewLine (Windows/Linux/Mac OSX/...)

Console.Write($"Regel 1{Environment.NewLine}Regel 2");
Regel 1
Regel 2
resultaat in de console

Pad naar Desktop opvragen

string pathToDesktop = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
Console.log($"Pad naar mijn desktop: {pathToDesktop}");
Pad naar mijn desktop: C:\Users\rogie\Desktop
resultaat in de console

Programma afsluiten

Environment.Exit(0);

Opmerking: het argument (0) wordt een exit-code genoemd. Een exit-code van 0 geeft aan dat het programma succesvol (zonder errors) beëindigd is. Een exit-code verschillend van 0, wordt gebruikt om aan te geven dat er tijdens de uitvoer van het programma iets foutgelopen is. De waarde duidt dan het type fout aan (zelfgekozen).

LINQ

De .NET namespace System.Linq biedt een uitbreiding van C# waarmee je met SQL-achtige queries allerlei databronnen kan bevragen. Een voorbeeld voor een array:

int[] scores = new int[] { 97, 54, 92, 81, 60 };

// Define the query expression.
int[] scoresAbove80 =
    (from score in scores
    where score > 80
    select score).ToArray();

// Execute the query.
Console.Write(string.Join(", ", scoresAbove80));
97, 92, 81
resultaat in de console

LINQ extensie methodes voor collecties

Linq biedt ook een aantal extensie methodes voor collecties

Math

De klasse Math bevat tal van wiskundige methodes en properties.

Properties en methodes

Property Omschrijving
PI Benadering van het getal pi
Methode Beschrijving Voorbeeld
Abs() absolute waarde Math.Abs(-7); // resultaat: 7
Ceiling() getal naar boven afronden Math.Ceiling(3.14); // resultaat: 4.0
Floor() getal naar beneden afronden Math.Floor(3.14); // resultaat: 3.0
Pow() machtsverheffing Math.Pow(5, 2); // resultaat: 5² = 25
Round() getal afronden tot aantal decimalen Math.Round(3.1415, 2); // resultaat: 3.14
Sqrt() vierkantswortel (square root) Math.Sqrt(25); // resultaat: 5.0
Max() grootste van twee getallen Math.Max(10, 20); // resultaat: 20.0

Voorbeelden

Berekening oppervlakte cirkel (m.b.v. PI)

int straal = 5;
double oppervlakte = straal * straal * Math.PI;

Console.WriteLine($"De oppervlakte bedraagt: {oppervlakte}");
De oppervlakte bedraagt: 78,5398163397448
gebruik van de PI constante

Wiskundige methodes

double a = Math.Ceiling(3.14); // resultaat: 4.0
double b = Math.Floor(3.14);   // resultaat: 3.0
double c = Math.Pow(5, 2);     // resultaat: 5² = 25
double d = Math.Round(3.1415, 2); // resultaat: 3.14 (afgerond tot op 2 cijfers na de komma)
double e = Math.Sqrt(16); // resultaat: vierkantswortel 16 = 4
int grootste = Math.Max(25, 12); // resultaat: grootste → 25
int kleinste = Math.Min(30, 15); // resultaat: kleinste → 15

Console.WriteLine($"a: {a}");
Console.WriteLine($"b: {b}");
Console.WriteLine($"c: {c}");
Console.WriteLine($"d: {d}");
Console.WriteLine($"e: {e}");
Console.WriteLine($"grootste: {grootste}");
Console.WriteLine($"kleinste: {kleinste}");
a: 4
b: 3
c: 25
d: 3,14
e: 4
grootste: 25
kleinste: 15
twee random getallen tussen 1 en 20

MessageBox

Een MessageBox is een dialoogvenster dat een boodschap voor de gebruiker bevat (bv.: een foutmelding, een bevestiging van een actie, ...).

Methodes

Methode Omschrijving
Show() Toon het dialoogvenster op het scherm

Code voorbeelden

Eenvoudig dialoogvenster

MessageBox.Show("Hello, World!");
MessageBox met enkel boodschap

Dialoogvenster met icoon

MessageBoxResult result = MessageBox.Show("Het bestand is opgeslagen", "", MessageBoxButton.OK, MessageBoxImage.Information);
MessageBox met boodschap en icoon

OK/Cancel ialoogvenster

MessageBoxResult result = MessageBox.Show(
   "Je wijzigingen gaan mogelijks verloren. Ben je zeker dat je wil afsluiten?",
   "WAARSCHUWING",
   MessageBoxButton.OKCancel,
   MessageBoxImage.Exclamation
);
if (result == MessageBoxResult.OK)
{
    Environment.Exit(0);
}
MessageBox met boodschap, titel, icoon en ok/cancel knoppen

Random

Met de klasse Random kan je een willekeurige waarde (getal) genereren.

Constructie

Random rnd = new Random();

Methodes

Methode Omschrijving
Next() Genereert een willekeurig getal tussen de meegegeven boven- en ondergrens

Code voorbeeld

Willekeurig getal van 1 tot en met 20

Random rnd = new Random();
int getal1 = rnd.Next(1, 21); // de bovengrens (21) is exclusief!!!
int getal2 = rnd.Next(1, 21); // de bovengrens (21) is exclusief!!!

Console.WriteLine($"Random getal 1: {getal1}");
Console.WriteLine($"Random getal 2: {getal2}");
Random getal 1: 15
Random getal 2: 6
twee random getallen tussen 1 en 20

Opmerking: de bovengrens is exclusief. Dat betekent dat het gegenereerde getal steeds strikt kleiner zal zijn dan de opgegeven bovengrens. Wil je bv. een willekeurig getal berekenen van 1 t.e.m. 5, gebruik je de parameters Next(1, 6).

String

De String klasse is een zogenaamde wrapper class, of uitbreiding van het string type. Beiden zijn uitwisselbaar; deze fragmenten zijn dus gelijkwaardig:

// de "string" notatie krijgt de voorkeur
string[] arr1 = new string[] { "blauw", "rood", "groen" };
string samengevoegd = string.Join(", ", arr1);

// de "String" notatie is technisch gelijkwaardig
String[] arr1 = new String[] { "blauw", "rood", "groen" };
String samengevoegd = String.Join(", ", arr1);

→ de eerste notatie is gebruikelijker; kwestie van gewoonte

Properties en methodes

Property Omschrijving
Length aantal karakters
Empty lege string constante
Methode Omschrijving
CompareTo() twee strings alfabetisch vergelijken
Contains() controleert of de string een gegeven string of char bevat
IsNullOrEmpty() gaat na of de string gelijk is aan null of de lege string ("")
Join() voegt een reeks waarden samen tot één string met daartussen een separator
IndexOf(), LastIndexOf() eerste/laatste positie zoeken van een karakter of tekst in de string (-1 indien niet gevonden)
Replace() voegt een reeks waarden samen tot één string met daartussen een separator
Split() een string rond een bepaald karakter opsplitsen in een reeks waarden
StartsWith(), EndsWith() controleert of de string met een bepaalde tekst begint of eindigt
Substring() deel van een string nemen
ToLower(), ToUpper() omzetten naar kleine letters / hoofdletters
Trim() karakters wegnemen (trimmen) aan het begin en het einde

String's vergelijken

Je kunt string's op twee verschillende maniere vergelijken:

string str1 = "banaan";
string str2 = "banaan";
string str3 = "citroen";
string str4 = "appel";

bool test1 = str1 == str2; // true; "banaan" is gelijk aan "banaan"
int test2 = str1.CompareTo(str2); // 0; "banaan" is gelijk aan "banaan"
int test3 = str1.CompareTo(str3); // −1; "banaan" komt alfabetisch vóór "citroen"
int test4 = str1.CompareTo(str4); // 1; "banaan" komt alfabetisch ná "appel"

Code voorbeelden

Lengte bepalen

De lengte bepaal je met de Length property

string str1 = "Now have that tasty morning burger.";
int len = str1.Length; // 35, dus inclusief spaties, leestekens enz...

Trimmen

Trimmen betekent karakters links en/of rechts wegsnijden:

// karakters trimmen aan het begin en einde
string str1 = "  ,Guitar, drum, Bass,. ";
str1 = str1.Trim(); // ",Guitar, drum, Bass,."
str1 = str1.Trim(new char[] { ',', '.' }); // "Guitar, drum, Bass"

Controle op deelstrings

string str2 = "Now have that tasty morning burger.";
int int1 = str1.IndexOf("at"); // 11
int int2 = str1.IndexOf('z'); // -1; not found
int int3 = str1.LastIndexOf('e'); // 32
bool bool1 = str1.StartsWith("No"); // true
bool bool2 = str1.Contains("that"); // true
bool bool3 = str1.Contains('X'); // false

Tekst vervangen, omzetten, inkorten

string str1 = "Hey hey hey, please DO NOT touch that!";
string str2 = str1.Substring(0, 21); // "Hey hey hey, please DO"
string str3 = str1.ToLower(); // "hey hey hey, please do not touch that!"
string str4 = str1.ToUpper(); // "HEY HEY HEY, PLEASE DO NOT TOUCH THAT!"
string str4 = str1.Replace("hey", "yo"); // "Hey yo yo, please DO NOT touch that!!" → hoofdlettergevoelig, vervangt alle

Nagaan of een string leeg is

Gebruik string.IsNullOrEmpty():

string str1 = "test";
bool bool1 = string.IsNullOrEmpty(str1); // False

string str2 = null;
bool bool2 = string.IsNullOrEmpty(str2); // True

string str3 = "";
bool bool3 = string.IsNullOrEmpty(str3); // True

string str4 = " ";
bool bool4 = string.IsNullOrEmpty(str4); // False - een spatie is geen lege string!

Je kan dit gebruiken om na te gaan of de gebruiker een TextBox heeft ingevuld

if (string.IsNullOrEmpty(txtNaam))
{
   lblFoutboodschap.Content = "Dit veld is verplicht";
}
else
{
   lblFoutboodschap.Content = "";
}

of korter met de ternaire operator:

lblFoutboodschap.Content = string.IsNullOrEmpty(txtNaam) ? "Dit veld is verplicht" : "";

Lijst of array samenvoegen tot een string, gescheiden door een tekst

Gebruik string.Join(). Voorbeeld voor een lijst:

List<string> fruit = new List<string>() { "appel", "banaan", "citroen", "peer" };
string reeks = string.Join(" - ", fruit);
Console.WriteLine(reeks);
appel - banaan - citroen - peer
Join() voorbeeld met List<string>

Voorbeeld voor een array:

int[] getallen = { 5, 7, 12, 8, 3 }; // → int[] array
string samengevoegd = string.Join(", ", getallen); // "5, 7, 12, 8, 3" → één string
Console.WriteLine(samengevoegd);
5, 7, 12, 8, 3
Join() voorbeeld met array

String splitsen naar een array

rond spaties
string zin = "dit is een zin met meerdere woorden";
string[] woorden = zin.Split(' '); // verdeel zin in woorden
foreach (string woord in woorden)
{
   Console.WriteLine(woord);
}
dit
is
een
zin
met
meerdere
woorden
resultaat in de console
rond een karakterlijst

Je kan als parameter van Split() een array van karakters opgeven waarrond gesplitst moet worden:

string txt = "0477/234.56.78"; // → één string
string[] parts2 = txt.Split(new char[] { '/', '.' }); // { "0477", "234", "56", "78" } → string[] array

Timer classes

Timers bieden de mogelijkheid de uitvoering van statements te plannen.

Stopwatch

Een stopwatch is een tijdsmeter die je kan starten, stoppen en resetten.

Properties en methodes

Property Omschrijving
Elapsed verstreken tijd (type TimeSpan)
IsRunning boolean die aangeeft of de stopwatch loopt of niet
Methode Omschrijving
Reset() reset de stopwatch
Start() start de stopwatch
Stop() stop de stopwatch

Codevoorbeeld

Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
Console.WriteLine("Timer is gestart. Druk een toets...");
Console.ReadKey(true);
TimeSpan elapsed = stopwatch.Elapsed; // verstreken tijdsspanne
stopwatch.Stop();
Console.WriteLine($"Timer is gestopt. De verstreken tijd is {elapsed.Seconds}.{elapsed.Milliseconds}s");
Console.ReadKey();
Timer is gestart. Druk een toets...
Timer is gestopt. De verstreken tijd is 2.47s
resultaat in de console

DispatcherTimer

Hiermee kan je een teller maken die een methode uitvoert met vaste tussentijden.

Properties, methodes en events

Property Omschrijving
Interval tussentijd (type TimeSpan)
IsEnabled boolean die aangeeft of de timer loopt of niet
Methode Omschrijving
Start() start de stopwatch
Stop() stop de stopwatch
Event Omschrijving
Tick vuurt af met vaste intervallen (zie de Interval property)

Codevoorbeeld

Een eenvoudige WPF teller die met een knop kan gestart worden, XAML:

<TextBlock x:Name="txtCount" Text="0" .../>
<Button x:Name="btnStart" Content="start" Click="BtnStart_Click"... />

De C# code-behind:

private int ticks;
private DispatcherTimer timer;

public MainWindow()
{
    InitializeComponent();
    ticks = 0; // zet teller op 0
    timer = new DispatcherTimer(); // maak teller aan
    timer.Interval = TimeSpan.FromMilliseconds(200); // tijdsspanne tussen twee ticks is 200 milliseconden
    timer.Tick += DoSomething; // voer deze methode bij elke tick uit
}

private void BtnStart_Click(object sender, RoutedEventArgs e) {
   timer.Start(); // start de teller als op de OK-knop geklikt wordt
}

private void DoSomething(object sender, EventArgs e)
{
    // elke 200 milliseconden uitgevoerd
    // ...
    ticks++;
    txtCount.Content = ticks;
}
DispatcherTimer voorbeeld