Functie’s toevoegen

Nu we de basis syntax van C# hebben behandeld komen we aan bij een veel terugkomend deel in programmeren. Het werken met functies, en later met klassen.

Functies (of Methods in engels) bieden je de mogelijkheid om een stuk code te ‘groeperen’ en later her te gebruiken. Het is vooral zinvol als je in je programma een bewerking hebt of een procedure die exact hetzelfde is en 4x in verschillende plekken voorkomt. Het is daar bij fijn als je met 1 aanpassing alle 4 plekken beïnvloedt.

Functies worden in C# verzamelt onder klassen (class). Dat zal in een latere tutorial uitgebreid welke mogelijkheden met een klasse te doen zijn. In dit geval zet je een functie dus niet in static void Main( string[] args ), maar in class Program.

Definieren van een functie

Een functie moet je definieren, om vervolgens in de rest van het programma die te kunnen ‘aanroepen’. Een functie heeft een invoer (parameters) en een uitvoer. Bijvoorbeeld:

CSHARP Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public int LeesGetal()
{
    int getal;
 
    // Vraag de gebruiker om 1 invoer.
    string invoer = Console.ReadLine();
 
    // Zet het getal veilig om.
    if (Int32.TryParse(invoer, out getal))
    {
        return getal;
    }
    else
    {
        return 0;
    }
}

Deze functie heet LeesGetal, heeft geen invoer (er staan geen parameters tussen de haakjes), en geeft een integer terug (staat voor functie naam). In deze functie wordt de gebruiker om invoer gevraagd, en vervolgens die veilig omzet van een string naar een integer. Als dat veilig kan, wordt de waarde getal teruggegeven (het resultaat), anders 0.

In je ‘hoofdprogramma’ is deze functie vervolgens eenvoudig te gebruiken:
CSHARP Code
1
2
int KistenMetAppels = LeesGetal();
int AppelsPerKist = LeesGetal();


Een ander voorbeeld is:
CSHARP Code
1
2
3
4
5
6
7
8
public bool IsBinnenGrenzen(int getal, int grens_laag, int grens_hoog)
{
    if (getal > grens_hoog)
        return false;
    if (getal < grens_laag)
        return false;
    return true;
}


Deze functie is te gebruiken om te controleren of een getal tussen 2 grenzen in ligt. Omdat zulke controle altijd ja/nee, of waar/onwaar situatie is, gebruiken ik als functieresultaat een boolean. Er zijn 3 parameters, getal, grens_laag en grens_hoog. Allen zijn een integer.

Als het getal daar tussen ligt, wordt ‘true’ (waar) als resultaat gegeven. Zo niet, wordt false (onwaar) terug gegeven. Deze functie is dan eenvoudig te gebruiken, bijvoorbeeld in combinatie met de vorig gegeven functie:

CSHARP Code
1
2
3
4
5
6
7
8
9
10
int Appels = LeesGetal();
 
if (IsBinnenGrenzen(Appels, 500, 1500))
{
    Console.WriteLine("Het aantal ligt binnen 500 en 1500!");
}
else
{
    Console.WriteLine("Het aantal ligt niet binnen 500 en 1500!");
}


Bij de functie IsBinnenGrenzen moeten we nu 3 parameters invullen. Deze staat in onze definitie van de functie IsBinnenGrenzen; namelijk 3 integers. Het gaat hier bij om de volgorde welke je ze opgeeft wat van belang is. Als eerste parameter vullen we de waarde van de variabele Appels in. Als 2de 500, en als 3de 1500.

Echter zal deze code niet meteen werken, dat zal ik hier onder uitleggen. Nu hebben we deze code gemaakt:
CSHARP Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public int LeesGetal()
{
    int getal;
 
    // Vraag de gebruiker om 1 invoer.
    string invoer = Console.ReadLine();
 
    // Zet het getal veilig om.
    if (Int32.TryParse(invoer, out getal))
    {
        return getal;
    }
    else
    {
        return 0;
    }
}
public bool IsBinnenGrenzen(int getal, int grens_laag, int grens_hoog)
{
    if (getal > grens_hoog)
        return false;
    if (getal < grens_laag)
        return false;
    return true;
}


Hier bij komt de variabele getal meerdere keren voor. Bij een functie is het zo dat de variabelen die in LeesGetal aangemaakt zijn (int getal en string invoer) niet in IsBinnenGrenzen beschikbaar zijn! Dat klinkt alsof het vervelend is; maar dat is het juist niet. In de ‘buitenwereld’ (buiten een functie om) heb je enkel te maken met de terugvoer en de parameters van die functie. Wat er intern gebeurd, staat los.

Merk op dat het programma waar we eerder mee begonnen zijn, static void Main( string[] args ), ook een functie is! Main is in een Console Programma het entry point van het programma. Deze functie wordt aanvankelijk aangeroepen om het programma te starten.

Static keyword

Bij de functie Main staat static voor. Bij de functies die ik net heb gemaakt niet. Waar is static dan precies goed voor?

Zoals vaak wordt gezegd is C# een Object Orientated taal (OO/OOP). Een object in een programmeertaal is de instantie van een klasse. In dit geval hebben we een klasse Program. Als er een attribuut static voor staat, wil dat zeggen dat we geen instantie van die klasse nodig hebben, om die functie te kunnen uitvoeren. Staat static er niet voor, moeten we eerst een instantie aanmaken.

In dit geval hebben we dus een instantie van de klasse Program nodig om de net aangemaakte funties te gebruiken. Dat kan als volgt:
CSHARP Code
1
2
3
4
5
6
7
8
9
10
11
12
Program Instantie = new Program( );
int Appels = Instantie.LeesGetal( );
 
if ( Instantie.IsBinnenGrenzen( Appels, 500, 1500 ) )
{
	Console.WriteLine( "Het aantal ligt binnen 500 en 1500!" );
}
else
{
	Console.WriteLine( "Het aantal ligt niet binnen 500 en 1500!" );
}
Console.ReadLine( );


Ik maak een variabele Instantie aan met het type Program. Dat klopt; de instantie van een klasse heeft ook een type. Die variabele vul ik in met een nieuwe instantie van Program (new Program()). Vervolgens kan ik vanuit Instantie de functies LeesGetal() of IsBinnenGrenzen(..) gebruiken.

Wil je kunnen gebruik maken van het vorige voorbeeld, die voorheen niet te gebruiken was, zal je voor de functies dus ‘static’ moeten zetten.