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:
- maak een map aan in je project voor de media bestanden via Add, New Folder...
- drag drop de media bestanden in deze map uit verkenner
- 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();
- de bewuste sound moet effect effectief ingeschakeld zijn in Windows en er moet een geluid voor gekozen zijn; hoe je dat moet doen vind je op https://www.windowscentral.com/how-customize-sound-effects-windows-10
- dit werkt enkel met WPF en .NET Framework Console apps, niet met .NET8 Console apps, zie overzicht
.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
- dit werkt enkel met WPF en .NET Framework Console apps, niet met .NET8 Console apps
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
- hoewel deze library als wat verouderd gezien wordt, werkt het nog steeds in een brede waaier van toepassingen
Video afspelen met 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
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:
- een
string
is een verzamelingchar
s - een
ComboBox
is een verzamelingComboBoxItems
- een
album
is een verzamelingfoto
’s - een
namenlijst
is een verzamelingnamen
- de
reeks van Fibonacci
(1, 1, 2, 3, 5, 8…) is een verzamelinggetallen
- …
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 |
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}");
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
⚠️ 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}");
}
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);
}
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.");
}
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);
}
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));
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)}");
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)}");
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:
- gaat het om een vast aantal elementen? → gebruik een array
- gaat het om heel veel elementen? → gebruik een array
- is performantie belangrijk? → gebruik een array
- in alle andere gevallen → gebruik een lijst
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));
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}");
}
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
- dit werkt even goed met
List<>
; gebruik dan waar nodigToList()
in plaats vanToArray()
om eenIEnumerable
om te zetten
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);
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");
Tekst schrijven over meerdere regels
Console.WriteLine("a");
Console.WriteLine("b");
Console.WriteLine("c");
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
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}");
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}");
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!");
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
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
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("✂ ✍ ✈ ☀");
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}");
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");
Pad naar Desktop opvragen
string pathToDesktop = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
Console.log($"Pad naar mijn desktop: {pathToDesktop}");
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));
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}");
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}");
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!");
Dialoogvenster met icoon
MessageBoxResult result = MessageBox.Show("Het bestand is opgeslagen", "", MessageBoxButton.OK, MessageBoxImage.Information);
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);
}
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}");
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:
- met behulp van de
==
-operator (true
indien beide string's dezelfde zijn, andersfalse
) - met de methode
CompareTo
, return-waarden:- −1 indien de string kleiner is dat de gegeven string
- 0 indien beide string's gelijk zijn aan elkaar
- 1 indien de string groter is dan de gegeven string
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);
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);
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);
}
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();
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;
}