TOC

This article has been localized into Czech by the community.

Třídy:

Lokální funkce

V předchozích článcích jsme se dozvěděli, že metody a vlastnosti patří do tříd v C#. Uvnitř metod můžete mít lokální proměnné, které jsou proměnné přístupné pouze v rozsahu této konkrétní metody. To dává smysl, protože často budete mít dočasná data, která potřebujete uložit, ale která by neměla být přístupná z jiných tříd nebo dokonce z jiných metod ve stejné třídě. Dříve jste nemohli udělat totéž s metodami - pokud byla metoda deklarována na třídě, mohla být alespoň přístupná z jiných metod ve stejné třídě, ale ve verzi C# 7 byl zaveden koncept lokálních funkcí.

Lokální funkce je deklarována uvnitř existující metody a je přístupná pouze z této metody. Toto velmi pevně zapouzdřuje funkcionalitu a také to jasně dává najevo každému, kdo čte váš kód, že tato funkcionalita je relevantní pouze pro deklarující metodu. Lokální funkce vypadá jako běžná metoda, ale bez modifikátoru viditelnosti, protože lokální funkce je vždy přístupná pouze z deklarující metody. Zde je příklad:

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));
}

Docela hloupý příklad, ale demonstruje, jak můžete deklarovat lokální funkci (v tomto případě nazvanou doesNameStartWithUppercaseChar) uvnitř metody (nazvané MethodWithLocalFunction) a poté ji zavolat jednou nebo několikrát zevnitř metody.

Jak vidíte v mém příkladu, deklaruji lokální funkci na začátku metody. Můžete to změnit, například deklarací uprostřed nebo na konci metody. Pouze v jednom případě to bude mít význam: Lokální funkce může přistupovat k proměnným deklarovaným uvnitř deklarující metody, ale pouze pokud byly deklarovány před lokální funkcí. Pokud tedy chcete využít tohoto chování, budete muset metodu upravit, například takto:

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]);

	}
}

Všimněte si, jak deklaruji proměnnou nameMaxLength uvnitř metody a poté k ní přistupuji uvnitř lokální funkce.

Statické lokální funkce

Ve verzi C# 8 byla přidána podpora pro statické lokální funkce. V době psaní je jediným rozdílem mezi běžnou a statickou lokální funkcí skutečnost, že statická lokální funkce nemůže používat proměnné z deklarující metody - jinými slovy, již nesdílejí rozsah. Pokud tedy chcete zajistit, aby vaše lokální funkce nemohla odkazovat na proměnné z metody nebo je měnit, jednoduše ji deklarujte jako statickou, takto:

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]);
	}
	....
}

Shrnutí

V některých situacích mohou být lokální funkce skvělým malým pomocníkem, když potřebujete zapouzdřit a znovu použít velmi specifickou funkcionalitu. Jako alternativu, pokud chcete funkcionalitu znovu použít z jiných metod, můžete zvážit její přidání jako skutečné metody na pomocnou třídu nebo jako rozšiřující metodu.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!