De meeste zullen wel weten dat je in C# zowel method overloading als optional parameters kunt gebruiken. Op het eerste gezicht lijken dat misschien twee functies die uitwisselbaar zijn (op de default value bij een optionele parameter na). Toch schuilt er verborgen gevaar achter de optional parameter.
Wat is ook al weer een optionele parameter?
{
return $”With {something} a {great} thing has started.”;
}
Toegegeven, het is een buitengewoon dom stuk code, maar het gaat maar even om het voorbeeld. In het bovenstaande voorbeeld is de parameter “great” een optionele parameter met de default value “Menno”.
Wat is dan het gevaar?
Stel dat de bovenstaande parameter in een nuGet package zit en gebruikt wordt door een applicatie met de onderstaande methode:
{
Console.WriteLine(package.DoSomethingGreat(2);
}
Als deze functie nu uitgevoerd wordt dan zou je, zoals verwacht, de volgende output op de console te zien krijgen:
Tot zover niets vreemds onder de zon. Maar stel nu dat we de default value van de optionele parameter in de package aanpassen:
We maken een nieuwe dll met de gewijzigde code en plaatsen deze dll met de hand in de publish map van onze applicatie (dat zou je normaal natuurlijk niet doen, maar het toont de valkuil achter de optionele parameter). We starten de applicatie opnieuw op en kijken naar de output:
Huh…. wat is hier aan de hand. We hebben de library toch vervangen. Hoe kan de applicatie nu de oude waarde voor de optionele parameter laten zien? What the $$! is hier aan de hand? Je rebuild de applicatie en controleert opnieuw de output:
Ok, hoe kan dit nu weer. De applicatie laat nu wel de juiste waarde zien.
Wat is er aan de hand?
Als je een optionele parameter gebruikt, dan wordt de default waarde automatisch ingevuld wanneer je de method aanroept zonder de optionele parameter op te geven. De reden dat het fout gaat, wanneer je de package dll vervangt zonder de applicatie opnieuw te builden is omdat de default waardes niet in worden gebruikt vanuit de package, maar bij de build in de applicatie worden opgeslagen. Dit betekend dat het gebruik van optionele parameters problemen kan geven wanneer er scenario’s zijn dat de package vervangen zou worden zonder dat het aanroepende project (de applicatie) opnieuw gecompileerd wordt.
Is dit in de praktijk een risico? Meestal niet, punt 1 omdat optionele parameters zelden aangepast worden en punt 2 omdat meestal de volledige applicatie opnieuw gecompileerd wordt als je updates aan packages uitvoert. Tegelijk geeft dit inzicht in hoe de optionele parameters in de build terechtkomen en kan het je een hoop hoofdpijn geven als je in deze valkuil loopt.