Úvod
Všichni určitě znáte Partial classes, které se objevily v předchozí verzi C# a jež slouží k rozdělení definice třídy do více souborů. To se používá převážně při práci s kódem, který automaticky generuje designér. Bez Partial classes by se mohlo stát, že si do vygenerovaného kódu přidáte nějakou vlastní funkcionalitu, ale po opětovném použití designeru se kód znovu vygeneruje a váš pracně vytvořený kód zmizí v nenávratnu. Proto se kód pomocí partial class syntaxe rozdělí do dvou souborů, kde jeden je spravován designérem a druhý obsahuje uživatelskou funkcionalitu.
Partial Method
Vemi podobný koncept nabízí i Partial metody. Ty nám umožní rozdělit definici funkce na dvě různá místa, čehož se využívá opět v kódu generovaném designérem a například v již dříve zmíněném LINQu je toho využito k takzvané lehké obsluze událostí. Čili obsluze pouze definováním vlastní partial metody a ne celého standardního .NET mechanizmu obsluhy událostí s event handlery.
Pokud si takovou partial metodu nadefinujeme, kód vygenerovaný designérem ji potom v patřičnou chvíli zavolá a my tak můžeme reagovat na nějakou událost běhu dané aplikace.
Syntaxe partial metody je následující:
partial class C
{
static partial void M(int i);
}
K deklaraci partial metody existují následující omezení:
- Deklarace musí obsahovat klíčové slovo partial
- Musí být deklarována uvnitř partial třídy
- Musí vracet void
- Nemůže být extern
- Nemůže mít out parametery
- Funkce nemůže mít modifikátory přístupu (public, private….)
- Nemůže být virtual.
Nyní si ukážeme příklad, jak mohou být partial metody použity v našem vlastním kódu. Máme třídu Customer, která obsahuje vlastnost Name a my chceme vytvořit události vyvolané před a po změně této vlastnosti. Nadefinujeme si proto partïal metody OnNameChanging (před) a OnNameChanged (po) a voláme je v setteru naší vlastnosti Name nehledě na to, zda tyto metody mají nějakou implementaci či nikoli.
partial class Customer
{
public string Name {
get { … }
set {
OnNameChanging(value);
_name = value;
OnNameChanged();
}
}
partial void OnNameChanging(string value);
partial void OnNameChanged();
}
Na závěr se ještě podíváme na nebezpečí, spojené s použitím partial metod. Toto nebezpečí spočívá v tom, že pokud volání naší partial funkce bude obsahovat libovolnou logiku, tato logika se neprovede, pokud není partial metoda implementována, a může vést k chybným výsledkům programu.
using System;
partial class PartialMethods
{
static void Main()
{
int i = 0;
Console.WriteLine(i);
Do(i++); //pokud Do() není implementováno, nenastane inkrementace !!
Console.WriteLine(i);
}
static partial void Do(int i);
}
Partial metody jsou jistě zajímavou, ale velmi opomíjenou, novou, funkcionalitou jazyka C#, která mimo jasných výhod při práci s generovaným kódem může také zlepšit obsluhovatelnost vlastních objektů a jejich logiky skrz „lehké události“. Jenom čas ukáže, zda se mezi programátory jejich používání rozšíří nebo ne.
Ondřej Šťastný
Developer, Microsoft Student Partner
ondrej.stastny@memos.cz