n00b pro

02. variabelen en berekeningen

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

Op Youtube

Deze video maakt deel uit van de IIP playlist van de Youtube channel van Rogier van der Linde.

Let op: deze video's zijn al een paar jaar oud, dus hier en daar kunnen kleine afwijkingen voorkomen met deze cursus, die wel altijd up-to-date is.

https://www.youtube.com/watch?v=zHaZUBq_MNU

Variabelen en constanten

Een variabele is een naam die een waarde van een bepaald type kan bevatten. Het vermelden van het bestaan van een variabele met type en naam noemt men declaratie, het geven van een eerste waarde initialisatie.

Declaratie

Een declaratie is een nieuwe variabele aanmaken met een naam.

string halloTekst; // tekst
int leeftijd; // geheel getal
double leeftijd; // kommagetal
char teken; // karakter
bool isCorrectAntwoord; // ja of nee

→ stijlregel: we noteren de naam in camelCaseNotatie

Initialisatie

De initialisatie betekent een variabele zijn initiële (eerste) waarde geven:

string halloTekst;
halloTekst = "Hallo Wereld!"; // variabele later geïnitialiseerd

Of declaratie en initialisatie in één keer:

string halloTekst = "Hallo Wereld!"; // variabele meteen geïnitialiseerd

Toewijzing

Je mag een variabele altijd een andere, nieuwe waarde geven – het is tenslotte "variabel". Het toekennen van een waarde heet een toekenning of toewijzing

string halloTekst = "Hallo Wereld!"; // declaratie en initialisatie
halloTekst = "Hallo Iedereen!"; // toewijzing: variabele krijgt (nieuwe) waarde

Overzicht datatypes

Het datatype beperkt welke waarden de variabele kan bevatten. Types gebruikt in deze cursus:

* meest gebruikt in deze cursus
Datatype Omschrijving Standaardwaarde Voorbeeld
string * tekenreeks (tekst) null string auto = "Honda";
int * gehele getallen (32 bits, pos/neg, max. 2.147.483.647) 0 int age = 25;
double * kommagetallen (15-16 tekens) (pos/neg) 0.0D double area = 12.3D; // of gewoon 12.3
bool * booleaanse waarde: waar/onwaar (true/false) false bool gevonden = false;
char * één teken (letter, cijfer, leesteken, ...) '\0' (nul) char geslacht = 'V';
decimal * voor geldbedragen, hogere precisie (28-29 tekens) 0.0M decimal price = 12.99M;
byte gehele getallen (8 bits, 0 tot 255) 0 byte red = 196;
long gehele getallen (64 bits, pos/neg, max. 9.223.372.036.854.775.807) 0 long nanoseconds = 638911067083572480L;
float kommagetallen (6-7 tekens) (pos/neg) 0.0F float price = 2.95F;

Let op: nullable types (zie verder) hebben altijd standaardwaarde null.

Format specifiers

Het formaat waarin waarden weergegeven worden in een tekst kan ingesteld worden met zgn. format specifiers. De belangrijkste opties:

Specifier Betekenis Voorbeeld
- standaardweergave 12,3456789
C “currency”, weergave als bedrag € 12,34
F1 “fixed”, één cijfer na de komma 12,3
F2 twee cijfers na de komma 12,34
P weergave als percentage met 2 cijfers na de komma 1.234,57%

Je kan ze gebruiken als argument in ToString():

double getal = 12.3456789;
Console.WriteLine($"één cijfer na de komma: {getal.ToString("F1")}");
Console.WriteLine($"twee cijfers na de komma: {getal.ToString("F2")}");
Console.WriteLine($"als percentage (x100): {getal.ToString("P")}");
Console.WriteLine($"als bedrag: {getal.ToString("C")}");

Ook rechtstreeks in string interpolatie kan:

double getal = 12.3456789;
Console.WriteLine($"één cijfer na de komma: {getal:F1}");
Console.WriteLine($"twee cijfers na de komma: {getal:F2}");
Console.WriteLine($"als percentage (x100): {getal:P}");
Console.WriteLine($"als bedrag: {getal:C}");
één cijfer na de komma: 12,3
twee cijfers na de komma: 12,35
als percentage (x100): 1.234,50%
als bedrag: € 12,35
resultaat in de console

Format specifiers kom je ook tegen bij datums en tijden.

Constanten

Een constante is als een variabele, maar het moet een vaste waarde hebben en die waarde kan niet meer veranderen. Een constante duid je aan met const:

const int MaxAantalPogingen = 3;
const string Prefix = "ABC_";

→ stijlregel: de meest gangbare notatie voor constanten in C# is PascalCaseNotatie

Constanten kunnen na initialisatie niet meer toegewezen worden. Dit is dus fout:

MaxAantalPogingen = 4; // FOUT! waarde kan niet meer veranderen
const string Suffix; // FOUT! constante moet een waarde hebben
const string Name = Console.ReadLine();  // FOUT! constante moet vaste waarde hebben

De regels zijn niet altijd duidelijk. Maar geen nood ‐ je programmeeromgeving zal je wel op fouten wijzen.

Naamgeving

De naam van een variabele moet voldoen aan de volgende syntaxregels:

Daarnaast houden we ons aan deze bijkomende stijlregels:

Er bestaan andere voorkeuren voor deze stijlregels, maar deze regels zijn de meest gangbare in C# en aanbevolen door Microsoft

Nullable types

Nullable types zijn primitieve types int, float, bool… uitgebreid met de null waarde (wat "geen waarde" betekent):

int getal1; // alle waarden tussen -2,147,483,648 en 2,147,483,647
int? getal2; // nullable int alle waarden tussen -2,147,483,648 en 2,147,483,647 of null

bool test1 // true of false
bool? test2; // nullable boolean: true, false of null

Nullable types zijn handig als je een bepaald primitief type wil gebruiken dat ook geen waarde moet kunnen hebben ("leeg").

use case 1: optionele gegevens

Stel dat je een programma maakt waarin iemand zijn geboortedatum kan invoeren. Niet iedereen kan of wil dit invullen:

DateTime? geboortedatum = null;
// Pas later ingevuld als de gebruiker dat wil

use case 2: spelletjes / scores

In een game kun je een highscore hebben die nog niet bestaat als niemand heeft gespeeld:

int? highscore = null; // nog geen score behaald

use case 3: database waarden

In een database kan een kolom leeg zijn (NULL). Als je dit ophaalt in C#, moet je dat kunnen representeren:

int? huisnummer = null; // gebruiker woont in een appartement zonder nummer

Conversie/parsing

Het omzetten van een waarde van één type naar een ander noemt men conversie; het specifieke geval waarin je een string omzet heet parsing.

verbredend vs. vernauwend

Er zijn twee soorten conversies:

impliciete conversie

Verbredende conversies gebeuren vaak automatisch of impliciet:

int int1 = 13;
double dbl1 = int1; // OK: int impliciet geconverteerd naar double
string str1 = "het kommagetal is " + dbl1; // OK: double impliciet geconverteerd naar een string
string str2 = $"het geheel getal is {int1}"; // OK: impliciete conversie van int naar string tijdens interpolatie

...maar niet altijd:

string str1 = int1; // FOUT! hier treedt geen impliciete conversie op

De logica wanneer wel en niet impliciete conversie optreedt is niet altijd even duidelijk. Maar geen nood, je programmeeromgeving zal je er wel op wijzen als een conversie ontbreekt.

expliciete (handmatige) conversie

Bij expliciete conversie forceer je handmatig de omzetting naar een ander type

ToString()

Conversie naar een string is eenvoudig: je kan altijd overal ToString() gebruiken

int int1 = 13;
string str1 = int1.ToString();

Convert klasse

Er zijn veel manieren om conversies door te voeren. De makkelijkste is met de methodes van de Convert klasse (zie 02. NET classes - Convert):

string str1 = "13"; string str2 = "13.45";
int int1 = Convert.ToInt32(str1);
double dbl1 = Convert.ToDouble(str2);

Parse(), TryParse()...

Er bestaan nog andere manieren om te converteren; voorbeelden:

string str1 = "13"; double dbl1 = 13.45;
int int1 = int.Parse(str1); // conversie met ...Parse() methode
int int2; bool success = int.TryParse(str1, out int2); // conversie met de ....TryParse() methode
int int3 = (int)dbl1; // conversie met (int)
string str2 = int1 + ""; // geforceerde conversie

Om het overzichtelijk te houden, raden we deze methodes af. Beperk je tot ToString() en Convert.To...()

Rekenkundige Operatoren

Dit zijn de klassieke bewerkingen die je uit de wiskunde kent: optellen, aftrekken...

Overzicht

Operator Beschrijving Voorbeeld
+ optellen int som = 5 + 3;
aftrekken int verschil = 5 − 3;
* vermenigvuldigen int product = 5 * 3;
/ delen int quotient = 5 / 3;
% modulo (rest na deling) int rest = 5 % 3;

Gehele deling

Als de twee getallen geheel zijn, wordt de deling geheel uitgevoerd:

int a = 13;
double b = a / 5; // resultaat is 2: gehele deling!
double c = Convert.ToDouble(a) / 5; // resultaat is 2.6
double d = a / Convert.ToDouble(5); // resultaat is 2.6
double e = a / 5.0; // resultaat is 2.6
double f = a * 2 / 5; // resultaat is 26 / 5, of 5: gehele deling!
double g = a * 2.0 / 5; // resultaat is 26.0 / 5, of 5.2

Verkorte Notaties

Operator Beschrijving Voorbeeld
++ increment int getal = 3;
getal++; // getal: 4
−− decrement int getal = 3;
getal−−; // getal: 2
+= n n bijtellen int getal = 6;
getal += 3; // getal: 9
−= n n aftrekken int getal = 3;
getal −= 10; // getal: −7
*= n vermenigvuldigen met n int getal = 3;
getal *= 5; // getal: 15
/= n delen door n double getal = 3;
getal /= 2; // getal: 1.5

Math-klasse

Voor bewerkingen als Round(), Max() enz... en constanten als PI zie 02. NET classes - Math