arrow-left

All pages
gitbookPowered by GitBook
1 of 8

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Scope van variabelen

hashtag
Scope van variabelen

De locatie waar je een variabele aanmaakt bepaald de scope, oftewel de zichtbaarheid, van de variabele. Eenvoudig gezegd zullen steeds de omliggende accolades de scope van de variabele bevatten. Indien je de variabele dus buiten die accolades nodig hebt dan heb je een probleem: de variabele is enkel bereikbaar binnen de accolades vanaf het punt in de code waarin het werd aangemaakt.

Zeker wanneer je begint met if, loops, methoden, etc. zal de scope belangrijk zijn: deze code-constructies gebruiken steeds accolades om codeblocks aan te tonen. Een variabele die je dus binnen een if-blok aanmaakt zal enkel binnen dit blok bestaan, niet erbuiten.

Wil je dus getal ook nog buiten de if gebruiken zal je je code moeten herschrijven zodat getal VOOR de if wordt aangemaakt:

De scope van variabelen is soms wat verwarrend. Hopelijk kan volgende kennis je helpen: .

hashtag
Variabelen met zelfde naam

Zolang je in de scope van een variabele bent kan je geen nieuwe variabele met dezelfde naam aanmaken:

Volgende code is dus niet toegestaan:

Je krijgt de error: A local variable named 'getal' cannot be declared in this scope because it would give a different meaning to 'getal', which is already used in a 'parent or current' scope to denote something else

Enkel de tweede variabele een andere naam geven is toegestaan in het voorgaande geval.

Dit is wel geldig, daar de scope van de eerste variabele afgesloten wordt door de accolades:

hashtag
Kennisclip

Beslissingen intro

Nu we de elementaire zaken van C# en Visual Studio kennen is het tijd om onze programma's wat interessanter te maken. De ontwikkelde programma's tot nog toe waren steevast lineair van opbouw, ze werden lijn per lijn uitgevoerd zonder de mogelijkheid om de flow van het programma aan te passen. Het programma doorliep de lijnen braaf na elkaar en wanneer deze aan het einde kwam sloot het programma zich af.

Onze programma's waren met andere woorden niet meer dan een eenvoudige oplijstingen van opdrachten. Je kan het vergelijken met een lijst die je vertelt over hoe je een brood moet kopen: 1. Neem geld uit spaarpot 2. Wandel naar de bakker om de hoek 3. Vraag om een brood 4. Krijg het brood 5. Betaal het geld aan de bakker 6. Keer huiswaarts 7. Smullen maar

Alhoewel dit algoritme redelijk duidelijk en goed zal werken, zal de realiteit echter zelden zo goed zijn. Een beter algoritme (dat foutgevoeliger is én interactieve voor de eindgebruiker) zal afhankelijk van de omstandigheden (bakker gesloten, geen geld meer, etc.) mogelijke andere stappen ondernemen. Het programma zal beslissingen maken.

H4: Beslissingen

Kennisclip "Scope van variabelenarrow-up-right
Scope arrow-up-right

If

In dit deel zullen we bekijken hoe we ons programma dynamischer kunnen maken met behulp van het if-statement.

hashtag
If

De if is een van de elementairste constructies in een programmeertaal. De syntax is als volgt:

Enkel indien de booleaanse expressie waar is, en dus true als resultaat heeft, zal de code binnen de accolades van het if-blok uitgevoerd worden. Indien de expressie niet waar is (false) dan wordt het blok overgeslagen en gaat het programma verder met de code eronder.

Een voorbeeld:

De uitvoer van dit programma zal zijn:

Indien number groter of gelijk aan 5 was dan zou er enkel B op het scherm zijn verschenen. De lijn Console.WriteLine("B") zal sowieso uitgevoerd worden zoals je ook kan zien aan de volgende flowchart:

hashtag
if met een block

Het is aangeraden om steeds na de if-expressie met accolades te werken. Dit zorgt ervoor dat alle code tussen het block (de accolades) zal uitgevoerd worden indien de booleanse expressie waar was. Gebruik je geen accolades dan zal enkel de eerste lijn na de if uitgevoerd worden bij true.

Een voorbeeld:

De booleaanse expressie die je tussen de if haakjes plaats moet een stuk code zijn dat altijd een bool als resultaat teruggeeft.

circle-exclamation

We verwachten dat je if altijd met een block gebruikt, omdat dat leesbaarder is. De versie zonder block zien we als een stijlfout!

hashtag
Veelgemaakte if-fouten

Er zijn enkele veelgemaakte fouten waar je op moet letten:

hashtag
Appelen en peren vergelijken

De types in je booleanse expressie moeten steeds vergelijkbaar zijn. Volgende code is dus fout: if( "4" > 3) daar we hier een string met een int vergelijken.

hashtag
Accolades vergeten

Accolades vergeten plaatsen om een codeblock aan te duiden, maar je code toch zodanig outlinen (met tabs) dat het lijkt of je een heel codeblock hebt. Het gevolg zal zijn dat enkel de eerste lijn na de if zal uitgevoerd worden indien true. Gebruiken we de if met block van daarnet maar zonder accolades dan zal de laatste lijn altijd uitgevoerd worden ongeacht de if:

Merk ook op dat je code anders uitlijnen géén invloed heeft op de uitvoer (wat bijvoorbeeld wel zo is bij de programmeertaal Python).

hashtag
Een puntkomma plaatsen na de booleanse expressie.

Dit zal ervoor zorgen dat er eigenlijk geen codeblock bij de if hoort en je dus een nietszeggende if hebt geschreven. De code na het puntkomma zal uitgevoerd worden ongeacht de if:

hashtag
Gebruik relationele operatoren

Met de relationele operatoren (==, !=, <, >, <= en >=) kunnen we complexere expressies schrijven die als uitkomst waar (true) of niet waar (false) geven.

Een voorbeeld:

Uitvoer van bovenstaande code zal zijn:

We kunnen ook meerdere expressies combineren zodat we complexere uitdrukkingen kunnen maken. Hierbij kan je gebruik maken van de logische operatoren (&&, ||, !) .

Een voorbeeld:

Uitvoer van dit programma zal zijn:

hashtag
If/else

Met if/else kunnen we niet enkel zeggen welke code moet uitgevoerd worden als de conditie waar is maar ook welke specifieke code indien de conditie niet waar (false) is. Volgend voorbeeld geeft een typisch gebruik van een if/else structuur om 2 waarden met elkaar te vergelijken:

Kan je zelf een flowchart van bovenstaande code tekenen? Try it!

hashtag
If/else if

Met een if/else if constructie kunnen we meerdere criteria opgeven die waar/niet waar moeten zijn voor een bepaald stukje code kan uitgevoerd worden. Sowieso begint men steeds met een if. Als men vervolgens een else if plaats dan zal de code van deze else if uitgevoerd worden enkel en alleen als de eerste expressie (van de if) niet waar was en de expressie van deze else if wel waar is.

Een voorbeeld:

circle-info

Merk op dat else if niet meer is dan een verkorte schrijfwijze voor nesting van een if in een else-block.

hashtag
Nesting

We kunnen met behulp van nesting ook complexere programma flows maken. Hierbij gebruiken we de accolades om het blok code aan te duiden dat bij een if/else if/else hoort. Binnen dit blok kunnen nu echter opnieuw if/else if/else structuren worden aangemaakt.

Volgende voorbeeld toont dit aan (bekijk wat er gebeurt als je emergencyValve aan closed gelijkstelt):

Booleanse logica en operators

hashtag
Relationele operators

Om beslissingen te kunnen nemen in C# hebben we een nieuw soort operators nodig. Operators waarmee we kunnen testen of iets waar of niet waar is. Dit doen we met de zogenaamde relationele operators. En guess what, je kent die al van uit het lager! Enkel de "gelijk aan" ziet er iets anders uit dan we gewoon zijn:

C#-syntax

Betekenis

hashtag
Logische operator

De logische EN, OF en NIET-operatoren die je kent van de booleaanse algebra kan je ook gebruiken in C#:

Je kan de niet-operator voor een expressie zetten om het resultaat hiervan om te draaien. Bijvoorbeeld:

hashtag
Booleaanse expressies

Een booleaanse expressie is een stuk C# code dat een bool als resultaat zal geven.

De logische operators van hierboven zijn operators die een bool teruggeven. Ze zijn zogenaamde test-operators: ze testen of iets waar is of niet. "Is b kleiner dan c?" schrijf je dan als de booleaanse expressie: b<c

Test maar eens wat er op je scherm komt als je in code schrijft: Console.WriteLine(45<=55);.

Zoals verwacht zal er true op het scherm verschijnen.

hashtag
Test jezelf

Wat zal de uitkomst zijn van volgende expressies? (protip: het zal steeds true of false zijn, niets anders)

  • 3>2

  • 4!=4

  • 4<5 && 4<3

Voorgaande oefeningen komen uit een kennistoets examen. Het is voornaam dat je dit soort expressies vlot kunt oplossen!

hashtag
Kennisclip

if( something == true)
{
    int getal = 0 ;  //Start scope getal
    getal = 6;
} // einde scope getal

Console.WriteLine(getal); // zal niet werken daar de scope van getal al gedaan was
int getal = 0 ;  //Start scope getal
if( something == true)
{
    getal = 6;
} 

Console.WriteLine(getal);
{
    int getal = 0;
    {
        int getal = 5; //Deze lijn is niet toegestaan
    }

}
{
    int getal = 0 ;
    //....
}
//Verder in code
{
    int getal = 5;
}
if (boolean expression) 
{
     // code hier moet uitgevoerd worden indien de booleaanse expressie waar is
}

"a"=="a" || 4>=3

  • (3==3 && 2<1) || 5!=4

  • !(4<=3)

  • true || false

  • !true && false

  • >

    groter dan

    <

    kleiner dan

    ==

    gelijk aan

    !=

    niet gelijk aan

    <=

    kleiner dan of gelijk aan

    >=

    groter dan of gelijk aan

    C#-syntax

    Betekenis

    &&

    en-operator

    ||

    of-operator

    !

    niet-operator

    Logische operators en expressies arrow-up-right

    Oefeningen

    hashtag
    H4-BMI-if

    hashtag
    Leerdoelen

    • conditionele boodschappen

    hashtag
    Functionele analyse

    Deze opgave bouwt verder op H3-BMI-berekenaar. Meerbepaald moet je de gebruiker niet alleen zijn of haar BMI tonen, maar moet je ook een gekleurde boodschap tonen die laat weten of de BMI goed zit of niet.

    Voor een BMI lager dan 18,5 toon je de boodschap "ondergewicht" in rode tekst. Voor een BMI die hoger ligt dan 18,5 maar lager dan 25, toon je de boodschap "normaal gewicht" in groene tekst. Voor een hogere BMI, maar lager dan 30, toon je in gele tekst "overgewicht". Voor een hogere BMI, maar lager dan 40, toon je "zwaarlijvig" in rode tekst. Voor een hogere BMI toon je "ernstige obesitas" in magenta.

    hashtag
    Technische analyse

    Via if en else (en dus ook else if) kan je gevallen onderscheiden. Gebruik ConsoleColor.Red, ConsoleColor.Green, ConsoleColor.Yellow en ConsoleColor.Magenta.

    hashtag
    UI

    console applicatie

    hashtag
    voorbeeldinteractie(s)

    circle-info

    De tekst zou in het groen moeten verschijnen maar Gitbook staat dit niet meteen toe.

    hashtag
    H4-schoenverkoper

    hashtag
    Leerdoelen

    • conditionele berekeningen

    hashtag
    Functionele analyse

    Maak een programma dat aan de gebruiker vraagt hoeveel paar schoenen hij wenst te kopen. Ieder paar schoenen kost normaal 20 euro. Indien de gebruiker 10 paar of meer koopt, kost elk paar maar 10 euro. Toon aan de gebruiker de totale prijs.

    Breid in een tweede stap je programma uit zodat gevraagd wordt vanaf welk aantal schoenen de prijs daalt naar 10 euro.

    hashtag
    Technische analyse

    Hou variabelen bij voor de prijs, de gereduceerde prijs en het aantal paar dat nodig is om korting te krijgen. De eerste twee variabelen maak je const.

    hashtag
    UI

    console applicatie

    hashtag
    voorbeeldinteractie(s)

    (Na de uitbreiding)

    hashtag
    H4-Ohm-berekenaar

    hashtag
    Leerdoelen

    • conditionele berekeningen

    circle-info

    De wet van Ohm houdt in dat een elektrische stroom (voorgesteld als I) gelijk is aan een spanningsverschil (U) gedeeld door een weerstand (R), dus I = U / R.

    hashtag
    Functionele analyse

    Vraag aan de gebruiker wat hij wenst te berekenen: Spanning, Weerstand of Stroomsterkte. Vraag vervolgens de twee andere waarden (als dus de gebruiker "Spanning" kiest vraag je aan de gebruiker de stroomsterkte en de weerstand) en bereken m.b.v. de wet van Ohm de gewenste waarde en toon aan de gebruiker.

    hashtag
    Technische analyse

    Denk eraan dat de gegeven formule wiskundig gedefinieerd is. In C♯ zal je rekening moeten houden met het feit dat deze drie maten uitgedrukt kunnen worden in kommagetallen.

    Je mag hier gewoon strings gebruiken om na te gaan welke maat de gebruiker heeft ingetypt. Je mag veronderstellen dat de getallen uitgedrukt zijn in de gewoonlijke eenheden (volt, ampère, ohm) zodat je ze gewoon kan invullen in de formule.

    hashtag
    UI

    console applicatie

    hashtag
    voorbeeldinteractie(s)

    hashtag
    H4-Schrikkeljaar

    hashtag
    Leerdoelen

    • conditionele berekeningen

    • geneste condities

    hashtag
    Functionele analyse

    De gebruiker voert een jaartal in en jouw programma toont of het wel of geen schrikkeljaar is. Een schrikkeljaar is deelbaar door 4, behalve als het ook deelbaar is door 100, tenzij het wél deelbaar is door 400.

    hashtag
    Technische analyse

    • gebruik de modulo-operator (%) om deelbaarheid door 4 na te gaan

    • gebruik een constructie met geneste ifs (en elses) om alle gevallen af te handelen

    hashtag
    UI

    console applicatie

    hashtag
    voorbeeldinteractie(s)

    hashtag
    H4-kleurcodes

    hashtag
    Leerdoelen

    • conditionele berekeningen

    • werken met switch

    hashtag
    Functionele analyse

    Deze oefening bouwt voort op H2-weerstandberekenaar-deel1. Vraag nu aan de gebruiker om de ringkleuren van de eerste 3 ringen in te voeren als tekst (bv groen). Toon vervolgens de de waarde van deze weerstand.

    hashtag
    Technische analyse

    Je zal elke kleur moeten omzetten in een getal en dan je eerdere oplossing hergebruiken. Omzetten doe je door de ingevoerde tekst te vergelijken met een vaste string en naargelang het resultaat variabelen voor ring 1, 2 en 3 in te vullen. Los deze oefening op met switch!

    hashtag
    UI

    console applicatie

    hashtag
    voorbeeldinteractie(s)

    circle-info

    Voel je je vandaag extra leergierig? Maak dan een extra enum, ResistorColors en zet de ingegeven tekst om naar waarden binnen deze enum vooraleer je de berekening uitvoert.

    hashtag
    H4-orakeltje

    hashtag
    Leerdoelen

    • conditionele berekeningen

    • werken met switch

    • werken met enumeraties

    hashtag
    Functionele analyse

    Vul de oefening aan uit het vorige hoofdstuk (zie ). Voor het orakel je vertelt hoe lang je te leven hebt zal eerst vragen naar je geslacht, dat je ingeeft als v of m. Dan vraagt ze je leeftijd. Mannen leven maximum tot hun 120 jaar. Vrouwen tot 150 jaar. Het orakel moet rekening houden met je huidige leeftijd, dus het mag niet zeggen dan een man nog 110 jaar te leven heeft als hij al 50 is, want dan zou hij ouder worden dan 120.

    hashtag
    Technische analyse

    • Je mag veronderstellen dat de huidige leeftijd onder het theoretische maximum ligt.

    • Gebruik een enum, met als naam Sexes en als waarden Male en Female om de geslachten voor te stellen.

    hashtag
    UI

    console applicatie

    hashtag
    voorbeeldinteractie(s)

    hashtag
    H4-ruimte-specifiek

    triangle-exclamation

    Dit is een complexere oefening dan de vorige! Pak het stapje voor stapje aan en gebruik indien nodig de debugger.

    hashtag
    Leerdoelen

    • werken met enumeraties

    • conversie van enums van en naar getallen

    • werken met switch

    hashtag
    Functionele analyse

    Deze opgave bouwt verder op H1-ruimte. Eerst vraag je de gebruiker om zijn of haar gewicht in te voeren. Daarna geef je een lijst van de planeten in ons zonnestelsel (Pluto inbegrepen, ook al is dat officieel geen planeet). Iedere planeet wordt voorafgegaan door een nummer. Dan selecteert de gebruiker het nummer van een van deze planeten en ten slotte toont het programma hoe veel de persoon weegt op de planeet in kwestie.

    hashtag
    Technische analyse

    Je hebt hier verschillende zaken nodig:

    • conversie naar een double om een gewicht in te lezen

    • een enum om de planeten voor te stellen

    • conversie van de planeten naar getallen om de gebruiker een nummer voor elke planeet te tonen

    hashtag
    UI

    console applicatie

    hashtag
    voorbeeldinteractie(s)

    !(0==2)  //zal true geven
    int number = 3;
    
    if ( number < 5 )
            Console.WriteLine ("A");
    Console.WriteLine("B");
    A
    B
    if ( number < 5 )
    {
        Console.WriteLine ("C");
        Console.WriteLine ("D");
    }
    if ( number < 5 )
        Console.WriteLine ("C");
        Console.WriteLine ("D");
    if ( number < 5 );
        Console.WriteLine ("C");
        Console.WriteLine ("D");
    int a, b, c;  
    
    a = 2;  
    b = 3;  
    
    if(a < b) 
    {
        Console.WriteLine("a is less than b"); 
    }
    
    if(a == b) 
    {
        Console.WriteLine("you won't see this");  
    }
    
    Console.WriteLine(); 
    
    c = a - b; // c contains -1 
    
    Console.WriteLine("c contains -1"); 
    if(c >= 0) 
    {
        Console.WriteLine("c is non-negative"); 
    }
    if(c < 0) 
    {
        Console.WriteLine("c is negative"); 
    }
    
    Console.WriteLine(); 
    
    c = b - a; // c now contains 1 
    Console.WriteLine("c contains 1"); 
    if(c >= 0) 
    {
        Console.WriteLine("c is non-negative"); 
    }
    if(c < 0)
    {
         Console.WriteLine("c is negative"); 
    }
    a is less than b
    
    c contains -1
    c is negative
    
    c contains 1
    c is non-negative
    int a = 5, b = 5, c = 10;
    
    if (a == b)
    {
            Console.WriteLine(a);
    }
    
    if ((a > c) || (a == b))
    {  
        Console.WriteLine(b);
    }
    
    if ((a >= c) && (b <= c))
    {
        Console.WriteLine(c);
    }
    5
    5
    int x = 10;
    
    if ( x > 9 )
    {
             Console.WriteLine ("x is greater than 9!");
    }
    else
    {
             Console.WriteLine ("x is less than 9!");
    }
    int x = 9;
    
    if (x == 10)
    {
         Console.WriteLine ("x is 10");
    }
    else if (x == 9)
    {
         Console.WriteLine ("x is 9");
    }
    else if (x == 8)
    {
         Console.WriteLine ("x is 8");
    }
    int reactorTemp = 1500;
    string emergencyValve = " ";
    
    if (reactorTemp < 1000)
    {
        Console.WriteLine("Reactor temperature normal");
    }
    else
    {
        Console.WriteLine("Reactor temperature too high!");
        if (emergencyValve == "closed")
        {
            Console.WriteLine("Reactor meltdown in progress!");
        }
    }

    Het programma zou in dit geval misschien iets simpeler zijn zonder, maar dan gebruik je dit een eerste keer.

  • Je kan vermijden dat de voorspelde leeftijd te hoog gaat door je .Next-call aan te passen, zodat de hoogst mogelijke waarde diegene is waarbij je de maximale leeftijd voor het gegeven geslacht bereikt.

  • conversie in de omgekeerde richting om de keuze van de gebruiker te verstaan

  • een switch om de juiste vermenigvuldigingsfactor te bepalen

  • deze pagina
    Hoeveel weeg je in kg?
    > 69.0
    Hoe groot ben je in m?
    > 1.78
    Je BMI bedraagt 21.78.
    normaal gewicht
    Hoeveel paar schoenen wil je kopen?
    > 3
    Je moet 60 euro betalen.
    Hoeveel paar schoenen wil je kopen?
    > 12
    Je moet 120 euro betalen.
    Vanaf welk aantal geldt de korting?
    > 7
    Hoeveel paar schoenen wil je kopen?
    > 8
    Je moet 80 euro betalen.
    Wat wil je berekenen? spanning, weerstand of stroomsterkte?
    > stroomsterkte
    Wat is de spanning?
    > 30
    Wat is de weerstand?
    > 20
    De stroomsterkte bedraagt 1.5.
    > 1997
    geen schrikkeljaar
    > 1996
    schrikkeljaar
    > 1900
    geen schrikkeljaar
    > 2000
    schrikkeljaar
    Wat is de kleur van de eerste ring?
    > rood
    Wat is de kleur van de tweede ring?
    > paars
    Wat is de kleur van de derde ring?
    > rood
    Deze weerstand heeft waarde van 2700 Ohm
    Wat is je geslacht?
    > m
    Hoe oud ben je?
    > 32
    Je hebt nog 80 jaar te leven!
    Hoeveel weeg je?
    > 69.0
    Voor welke planeet wil je je gewicht kennen?
    1. Mercurius
    2. Venus
    3. Aarde
    4. Mars
    5. Jupiter
    6. Saturnus
    7. Uranus
    8. Neptunus
    9. Pluto
    > 2
    Daar weeg je 62.79kg.

    enum

    hashtag
    Enum datatypes

    Deel van dit hoofdstuk is uit Visual C# 2012 - De basis (Sander Gerz)

    hashtag
    De bestaansreden voor enums

    Stel dat je een programma moet schrijven dat afhankelijk van de dag van de week iets anders moet doen. In een wereld zonder enums (enumeraties) zou je dit kunnen schrijven op 2 zeer foutgevoelige manieren: 1. Met een int die een getal van 1 tot en met 7 kan bevatten 2. Met een string die de naam van de dag bevat

    hashtag
    Slechte oplossing 1: Met ints

    De waarde van de dag staat in een variabele int dagKeuze. We bewaren er 1 in voor Maandag, 2 voor dinsdag, enzovoort.

    Deze oplossing heeft 2 grote nadelen:

    • Wat als we per ongeluk dagKeuze een niet geldige waarde geven, zoals 9, 2000, -4, etc. ?

    • De code is niet erg leesbaar. dagKeuze==2? Was dat nu dinsdag of woensdag (want misschien was maandag 0 i.p.v. 1).

    hashtag
    Slechte oplossing 2: Met strings

    De waarde van de dag bewaren we nu in een variabele string dagKeuze. We bewaren de dagen als "maandag", "dinsdag", etc.

    De code wordt nu wel leesbaarder dan met 1, maar toch is ook hier 1 groot nadeel:

    • De code is veel foutgevoeliger voor typfouten. Wanneer je "Maandag" i.p.v. "maandag" bewaard dan zal de if al niet werken. Iedere schrijffout of variant zal falen.

    hashtag
    Enumeraties: het beste van beide wereld.

    Enumeraties (enum) zijn een C# syntax die bovenstaand probleem oplost en het beste van beide samenvoegt: leesbaardere code en visual studio kan je helpen met minder foutgevoelige foute schrijven.

    Het keyword enum geeft aan dat we een nieuw type maken dat maar enkele mogelijke waarden kan hebben. Nadat we dit nieuwe type hebben gedefiniëerd kunnen we variabele van dit nieuwe type aanmaken. De variabele die we dan later maken zal van dit type zijn en enkel de opgegeven waarden mogen bevatten. Ook zal IntelliSense van Visual Studio je de mogelijke waarden helpen invullen.

    In C# zitten al veel Enum-types ingebouwd. Denk maar aan ConsoleColor: wanneer je de kleur van het lettertype van de console wilt veranderen gebruiken we een enum-type. Er werd reeds gedefinieerd wat de toegelaten waarden zijn, bijvoorbeeld: Console.ForegroundColor = ConsoleColor.Red;

    hashtag
    Zelf enum maken

    Zelf een enum type maken gebeurt in 2 stappen: 1. Het type en de mogelijke waarden definiëren 2. Variabele(n) van het nieuwe type aanmaken en gebruiken in je code

    hashtag
    Stap 1: het type definiëren

    We maken eerst een enum type aan. In je console-applicaties moet dit binnen class Program gebeuren, maar niét binnen de (main) methoden:

    Vanaf nu kan je variabelen van het type Weekdagen aanmaken.

    Merk op dat er geen puntkomma achteraan komt.

    Locatie enum definitie

    Let er op dat je je enum op de juiste locatie in je code schrijft:

    Dit is fout:

    hashtag
    Stap 2: variabelen van het type aanmaken en gebruiken.

    We kunnen nu variabelen van het type Weekdagen aanmaken. Bijvoorbeeld:

    En vervolgens kunnen we waarden aan deze variabelen toewijzen als volgt

    Kortom: we hebben variabelen zoals we gewoon zijn, het enige verschil is dat we nu beperkt zijn in de waarden die we kunnen toewijzen. Deze kunnen enkel de waarden zijn die in het type gedefiniëerd werden. De code is nu ook een pak leesbaarder geworden.

    hashtag
    Enums en beslissingen werken graag samen

    Ook de beslissingsstructuren worden leesbaarder:

    of een switch:

    hashtag
    Conversie

    Intern worden de enum-variabelen als ints bewaard. In het geval van de Weekdagen zal maandag de waarde 0 krijgen, dinsdag 1, etc.

    Volgende conversies met behulp van zijn dan ook perfect toegelaten:

    Wil je dus bijvoorbeeld 1 dag bijtellen dan kan je schrijven:

    hashtag
    Andere interne waarde

    Standaard worden de waarden dus genummerd intern beginnende bij 0, enz. Je kan dit ook manueel veranderen door bij het maken van de enum expliciet aan te geven wat de interne waarde moet zijn, als volgt:

    De dagen zullen nu vanaf 1 genummerd worden, dus WeekDagen.Woensdag zal de waarde 3 hebben.

    We kunnen ook nog meer informatie meegeven, bijvoorbeeld:

    In dit geval zullen Maandag tot Vrijdag intern als 1 tot en met 5 bewaard worden, Zaterdag als 50, en Zondag als 60.

    hashtag
    Why should I care?

    Je kan perfect leven zonder enum. Vele programmeurs voor je hebben dit bewezen. Echter, van zodra ze enumontdekten (en begrepen) zijn nog maar weinig programmeurs ervan af gestapt.

    De eerste kennismaking met enumeraties is wat bevreemdend: je kan plots je eigen datatypes aanmaken?! Van zodra je ze in de vingers hebt zal je ontdekken dat je veel leesbaardere code kunt schrijven én dat Visual Studio je kan helpen met het opsporen van bugs.

    Wanneer gebruik je enum? Telkens je een variabele (of meerdere) nodig hebt waarvan je perfect op voorhand weet welke handvol mogelijke waarde ze mogen hebben. Ze worden bijvoorbeeld vaak gebruikt in finite state machines. Bij game development willen we bijhouden in welke staat het programma zich bevindt: intro, startmenu, ingame, gameover, optionsscreen, etc. Dit is een typisch enum verhaal. We definiëren hiervoor het volgende type:

    En vervolgens kunnen we dan met een eenvoudige switch in ons hoofdprogramma snel de relevante code uitvoeren:

    hashtag
    Kennisclip

    Switch

    hashtag
    Switch

    Een switch statement is een program-flow element om een veelvoorkomende constructie van if/if else...else elementen eenvoudiger te tonen. Vaak komt het voor dat we bijvoorbeeld aan de gebruiker vragen om een keuze te maken (bijvoorbeeld een getal van 1 tot 10, waarbij ieder getal een ander menu-item uitvoert van het programma), zoals:

    Met een switch kan dit eenvoudiger. De syntax van een switch is een beetje specialer dan de andere programma flow-elementen (if, while, etc.), namelijk als volgt:

    value is de waarde of variabele (beide mogen) die wordt gebruikt als test in de switch. Iedere case begint met het case keyword gevolgd door de waarde die value moet hebben om in deze case te springen. Na het dubbelpunt volgt vervolgens de code die moet uitgevoerd worden in deze case. De case zelf mag eender welke code bevatten (methoden, nieuwe program flow elementen, etc.), maar moet zeker afgesloten worden met het break keyword.

    Tijdens de uitvoer zal het programma value vergelijken met iedere case constant van boven naar onder. Wanneer een gelijkheid wordt gevonden dan wordt die case uitgevoerd. Indien geen case wordt gevonden die gelijk is aan value dan zal de code binnen de default-case uitgevoerd worden (de else achteraan indien alle vorige if else-tests negatief waren).

    Het menu van zonet kunnen we nu herschrijven naar een switch:

    hashtag
    Opgelet:

    De case waarden moeten literals zijn. Dit zijn waarden die je letterlijk uitschrijft, d.w.z. die je niet voorstelt als variabele (1, "1", 1.0, 1.d, '1', etc.)

    hashtag
    Falthrough

    Soms wil je dat dezelfde code uitgevoerd wordt bij 2 of meer cases. Je kan ook zogenaamde fallthrough cases beschrijven wat er als volgt uit ziet:

    In dit geval zullen zowel de waarden 2 en 3 resulteren in de zin "Laden of opslaan gekozen" op het scherm.

    int option;
    Console.WriteLine("Kies 1 voor afbreken, 2 voor opslaan, 3 voor laden:");
    option = Convert.ToInt32(Console.ReadLine());
    
    if (option == 1)
        Console.WriteLine("Afbreken gekozen");
    else if (option == 2)
        Console.WriteLine("Opslaan gekozen");
    else if (option == 3)
        Console.WriteLine("Laden gekozen");
    else
        Console.WriteLine("Onbekende keuze");
    switch (value)
    {
          case constant:
               statements
               break;
          case constant:
               statements
               break;
          default:
               statements
               break;
      }
    int option;
    Console.WriteLine("Kies 1 voor afbreken, 2 voor opslaan, 3 voor laden:");
    option = Convert.ToInt32(Console.ReadLine());
    switch (option)
    {
        case 1:
            Console.WriteLine("Afbreken gekozen");
            break;
        case 2:
            Console.WriteLine("Opslaan gekozen");
            break;
        case 3:
            Console.WriteLine("Laden gekozen");
            break;
        default:
            Console.WriteLine("Onbekende keuze");
            break;
      }
    switch (option)
    {
        case 1:
            Console.WriteLine("Afbreken gekozen");
            break;
        case 2:
        case 3:
            Console.WriteLine("Laden of opslaan gekozen");
            break;
        default:
            Console.WriteLine("Onbekende keuze");
            break;
      }
    castingarrow-up-right
    Enums gebruikenarrow-up-right
    if(dagKeuze==1)
    {
        Console.WriteLine("We doen de maandag dingen");
    }
    else 
    if (dagKeuze==2)
    {
        Console.WritLine("We doen de dinsdag dingen");
    }
    else 
    if //enz..
    if(dagKeuze=="maandag")
    {
        Console.WriteLine("We doen de maandag dingen");
    }
    else 
    if (dagKeuze=="dinsdag")
    {
        Console.WritLine("We doen de dinsdag dingen");
    }
    else 
    if //enz..
    enum Weekdagen {Maandag, Dinsdag, Woensdag, Donderdag, Vrijdag, Zaterdag, Zondag}
    public class Program
    {
        enum Weekdagen {Maandag, Dinsdag, Woensdag, Donderdag, Vrijdag, Zaterdag, Zondag}
    
        public static void Main(string[] args)
        {
    
        }
    }
    public class Program
    {
        public static void Main(string[] args)
        {
            enum Weekdagen {Maandag, Dinsdag, Woensdag, Donderdag, Vrijdag, Zaterdag, Zondag}   
        }
    }
    Weekdagen dagKeuze;
    Weekdagen andereKeuze;
    dagKeuze = Weekdagen.Donderdag;
    if(dagKeuze == Weekdagen.Woensdag)
    switch(dagKeuze)
    {
        case Weekdagen.Maandag:
            Console.WriteLine("It's monday!");
            break;
        case Weekdagen.Dinsdag:
         //etc.
    }
    int keuze = 3;
    
    Weekdagen dagKeuze = (Weekdagen)keuze;
    
    //dagKeuze zal de waarde Weekdagen.Donderdag hebben
    Weekdagen dagKeuze= Weekdagen.Dinsdag;
    int extradag= (int)dagKeuze + 1;
    Weekdagen nieuweDag= (Weekdagen)extradag;
    //extraDag heeft de waarde Weekdagen.Woensdag
    enum WeekDagen {Maandag=1, Dinsdag, Woensdag, Donderdag, Vrijdag, Zaterdag, Zondag}
    enum WeekDagen {Maandag=1, Dinsdag, Woensdag, Donderdag, Vrijdag, Zaterdag=50, Zondag=60}
    enum gamestate {intro, startmenu, ingame, gameover, optionsscreen}
    //Bij opstart:
    gamestate playerGameState= gamestate.intro;
    
    //later:
    switch(playerGameState)
    {
        case gamestate.intro:
            //show fancy movie
            break;
        case gamestate.startmenu:
            //show start menu
            break;
        //etc...