Drop links or images here to add them to the editor.

In alle voorbeelden tot nu toe gaven we onze parameters door als waarde. In programmeerjargon spreken we van byval (by value). Dat betekent: op het moment dat je de functie oproept, wordt de waarde van je variabele gekopieerd naar de parameter. De functie werkt met die kopie. Wijzig je de parameter binnen de functie, dan heeft dat geen invloed op de oorspronkelijke variabele waarmee je de functie opriep.

Byval: de kopie wijzigen verandert niets

Bekijk deze functie Verdubbel, die haar parameter verdubbelt:

int getal = 5;
int resultaat;

resultaat = Verdubbel(getal);
Console.WriteLine(getal);
int Verdubbel(int getal)
{
    getal = getal * 2;
    return getal;
}

Binnen de functie wordt de parameter getal wel degelijk gewijzigd naar 10. Maar dat is een kopie. Kijken we ná de oproep naar de variabele getal in het hoofdprogramma, dan heeft die nog steeds de waarde 5:

5

Byref: een koppeling met de originele variabele

De tegenhanger van byval is byref (by reference). In dat geval wordt er als het ware een koppeling gemaakt tussen de variabele waarmee je de functie oproept en de parameter. Het is in wezen dezelfde variabele. Wijzigt de functie de parameter, dan wijzigt ze meteen ook de oorspronkelijke variabele.

In C# gebruik je hiervoor het sleutelwoord ref, en dat zowel bij de definitie van de functie als bij de oproep:

int getal = 5;
int resultaat;

resultaat = Verdubbel(ref getal);
Console.WriteLine(getal);
int Verdubbel(ref int getal)
{
    getal = getal * 2;
    return getal;
}

Het sleutelwoord ref geeft aan dat de functie de variabele van de oproep kan wijzigen.

Nu wijst getal in de functie naar dezelfde variabele als in het hoofdprogramma. De verdubbeling werkt dus door, en na de oproep toont het programma 10:

10

Wanneer gebruik je byref?

Met ref kan een functie de oorspronkelijke variabele wijzigen. Dat is niet zonder gevaar: het is minder voorspelbaar dan een gewone parameter, want de functie verandert iets buiten zichzelf. Toch is het soms handig, bijvoorbeeld wanneer je wil dat een functie meer dan één resultaat teruggeeft. Met een gewone return kan je maar één waarde teruggeven; met meerdere ref-parameters kan een functie verschillende variabelen tegelijk aanpassen.