Skip Navigation Links.
Skip Navigation Links.

.net student

microsoft

Vyhledávání v obsahu portálu


Přihlášení uživatele

Přihlášení uživatele

Členové:
  • Poslední nový uživatel Poslední: zplasek
  • Nový dnes Dnes nových 0
  • Nový včera Včera nových: 0
  • Počet uživatelů: Celkem: 4273
Lidé online:
  • Návštěvníci: Návštěvníků: 43
  • Registrovaných Členů: 1
  • Celkem Celkem: 44
Mapa Stranek

Nejlepší novinka C# 3.0 o které jste (pravděpodobně) nikdy neslyšeli

V dnešním příspěvku bych se s Vámi rád podělil o své znalosti Partial Methods, nové to vlastnosti jazyka C#, která ovšem celkem úspěšně uniká pozornosti většiny programátorů. A to i přes to, že je tato novinka extenzivně použita v LINQu a hodí se i pro mnoho dalších scénářů.

Ú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í:

  1. Deklarace musí obsahovat klíčové slovo partial
  2. Musí být deklarována uvnitř partial třídy
  3. Musí vracet void
  4. Nemůže být extern
  5. Nemůže mít out parametery
  6. Funkce nemůže mít modifikátory přístupu (public, private….)
  7. 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

Ondřej Šťastný :: 15. května 2008 :: 871 shlédnutí :: 0 komentářů
kategorie:

Comments

Nyní zde nejsou žádné kometáře. Buďte první!
Musíte být přihlášen pro posílání komentářů. Přihlásit se můžete zde
Přehled posledních diskuzí

Přehled posledních diskuzí

  1. RE: Dive IN [08.07.2008 12:01 odp.]
    Dobrý den,tak jsem zjistil, že v kořenovém adresáři webu clanzone chyběl adresář "App_Themes".a tady je nový odkaz ke st...
  2. RE: Dive IN [08.06.2008 3:22 odp.]
    Tak dlouho jsem hledal na webu až jsem to stáhl. Je třeba to odladit. Tady je link ke stažení: http://uloz.to/639063/Cla...
  3. RE: slidy z akce 15.5 na MFF [05.22.2008 7:47 odp.]
    Ahoj,omlouvam se za zpozdeni. Uz je to vsechno k dispozici v sekci "Ke Stazeni".
  4. 2 cpu [05.22.2008 10:59 dop.]
    AhojNeviem ci moj dotaz pisem do spravnej sekcie fora ale asi to bude jedno.Potreboval by som poradit ako spravitwhile(t...
Novinky z klubů

Novinky z klubů

  1. Vývojářské odpoledne - Zima 2008 28. září 2008
    Každé čtvrteční odpoledne se podíváme pod pokličku nějaké technologii předevš&...
  2. Programátorské večery 26. září 2008
    Programátorské večery se v zimním semestru 08/09 konají opět ve čtvrtek od 17:20 v učebně S4...
  3. Večery: Microsoft XNA - snadný vývoj her 24. září 2008
    Microsoft XNA je platforma určená pro snadný vývoj počítačových her pro PC, Xbox 360 ...
  4. Programátorské Odpoledne na MFF UK 11. května 2008
    Ve čtvrtek 15. května proběhne na MFF UK na Malostranském nám. (v posluchárně S5) od 16:00 do 19:00...
Co se píše jinde

Co se píše jinde

Dědičnost

V tomto díle si vysvětlíme základy dědičnosti a přepisování metod z rodičovských tříd. Povíme si také, co jsou to abs...

Vydáno Mono 2.0

Dnes byla vydána dlouho očekávaná verze open source implementace .NET frameworku pro Unix, Windows, MacOS a další ope...

WebExpo 2008

Tento podzim se uskuteční první ročník dosud největšího dvoudenního veletrhu o technologiích, webdesignu a marketingu...

ImagineCup

Upoutávka na celosvětovou studentskou soutěž Imagine Cup 2009!

3) DLR - Parser

Parser je velice důležitá část kompilátoru. Jeho úkolem je sestavit abstract syntax tree (AST) z tokenů vygenerovanýc...