This article has been localized into Dutch by the community.
Locale functies
We leerden in voorgaande artikelen dat methods en properties behoren bij classes in C#. Binnen methods heb je locale (local) variabelen, wat variabelen zijn die alleen maar toegankelijk zijn in de sfeer van deze specifieke method. Dit is logisch omdat je vaak tijdelijke gegevens wilt opslaan, maar die niet toegankelijk moeten zijn vanuit andere classes of zelfs vanuit andere methods in dezelfde class. Eerder kon je niet hetzelfde doen met methods. Als een method werd gedeclareerd bij een class was hij op zijn minst toegankelijk vanuit andere methods binnen dezelfde class, maar in C# versie 7 werd het concept van local functions geïntroduceerd.
Een lokale functie wordt binnen een bestaande method gedeclareerd en kan alleen maar binnen deze method worden benaderd. Dit omsluit de functionaliteit erg stevig en maakt het de lezers van jouw code duidelijk dat deze functionaliteit alleen maar relevant is voor de declarerende method. Een lokale functie lijkt op een reguliere method, maar dan zonder de zichtbaarheids modifier, omdat een lokale functie altijd alleen maar toegankelijk is binnen de declarerende method. Hier is een voorbeeld:
public void MethodWithLocalFunction()
{
bool doesNameStartWithUppercaseChar(string name)
{
if(String.IsNullOrEmpty(name))
throw new Exception("name parameter must contain a value!");
return Char.IsUpper(name[0]);
}
List<string> names = new List<string>()
{
"john doe",
"Jane doe",
"dog Doe"
};
foreach(string name in names)
Console.WriteLine(name + " starts with uppercase char: " + doesNameStartWithUppercaseChar(name));
}
Een nogal stom voorbeeld, maar het demonstreert hoe je een lokale functie kunt declareren (in dit geval doesNameStartWithUppercaseChar) binnen een method (MethodWithLocalFunction) en hem daarna één of meerdere keren kunt aanroepen vanuit de method.
Zoals je kunt zien, declareer ik de lokale functie aan het begin van de method. Het staat je vrij om dit in het midden of aan het einde van de method te doen. Echter in één geval zal het verschil maken: Een lokale functie heeft toegang tot variabelen die gedeclareerd zijn binnen de declarerende method, maar alleen dan, wanneer ze zijn gedeclareerd vóór de lokale functie. Dus als je van dit gedrag gebruik wilt maken, zal je de method moeten wijzigen, bc. zoals hier:
public void MethodWithLocalFunction()
{
int nameMaxLength = 10;
List<string> names = new List<string>()
{
"john doe",
"Jane doe",
"dog Doe"
};
foreach(string name in names)
Console.WriteLine(name + " starts with uppercase char: " + doesNameStartWithUppercaseChar(name));
bool doesNameStartWithUppercaseChar(string name)
{
if(String.IsNullOrEmpty(name))
throw new Exception("name parameter must contain a value!");
if(name.Length > nameMaxLength)
throw new Exception("name is too long! Max length: " + nameMaxLength);
return Char.IsUpper(name[0]);
}
}
Kijk goed hoe ik de nameMaxLength variabele binnen de method declareer en hem dan benader binnen de lokale functie.
Statische (static) lokale functies
In C# versie 8 werd ondersteuning voor statische lokale functies toegevoegd. Het enige verschil tussen een reguliere en een statische lokale functie is het feit dat een statische lokale functie geen variabelen kan gebruiken van de declarerende method. Met andere woorden, ze delen niet langer het bereik (scope). Dus als je er zeker van wilt zijn dat jouw lokale functie geen referentie kan maken naar variabelen of die kan kan veranderen, dan moet je hem gewoon declareren als statisch (static), zoals hier:
public void MethodWithLocalStaticFunction()
{
int nameMaxLength = 10;
static bool doesNameStartWithUppercaseChar(string name)
{
// Local variables, e.g. nameMaxLength, are no longer accessible here....
if(String.IsNullOrEmpty(name))
throw new Exception("name parameter must contain a value!");
return Char.IsUpper(name[0]);
}
....
}
Samenvatting
In sommige situaties kunnen lokale functies prima helpertjes zijn als je specifieke functionaliteit wilt inkapselen en hergebruiken. Als alternatief , en wanneer de functionaliteit kan worden hergebruikt van andere methods, zou je kunnen overwegen om het toe te voegen aan een helper class of als een extensie method.