Delegáti & události – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Delegáti & události – .NET – Fórum – Programujte.comDelegáti & události – .NET – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Petrroll0
Stálý člen
21. 7. 2010   #1
-
0
-

Zdar, právě se snažím pochopit události & delegáty. Mám pocit že logiku chápu.
Delegáti jsou více méně ukazatelé na metody (můžou ukazovat na více metod), list na které metody ukazují je dynamický, etc..
Události jsou seznamy metod/delgátů které jsou volány když se něco stane co vyvolá danou událost. A tady mám právě problém, odběratelem události může být i delegát, i metoda či jenom jedno z toho?

Nahlásit jako SPAM
IP: 92.62.224.–
Reklama
Reklama
velurex0
Stálý člen
21. 7. 2010   #2
-
0
-

Chápu tvé zmatení. Odběratelem události může být pouze delegát (tedy "odkaz na metodu") nikoliv metoda samotná. Co tě možná mate, je, že novější verze .netu dovolují v kódu zapsat delegáta pouze jménem metody na kterou se odkazuje. Interně to ale zůstává delegát. Je to sice jednodušší na použití, ale může být horší na pochopení. Praxe tě naučí. :)

Nahlásit jako SPAM
IP: 213.191.119.–
Petrroll0
Stálý člen
21. 7. 2010   #3
-
0
-

Děkuji za odpověď, nyní snad chápu.

Nahlásit jako SPAM
IP: 92.62.224.–
Petrroll0
Stálý člen
29. 7. 2010   #4
-
0
-

Trochu jsem se u toho zastavil, a nejsem si jist jestli to jde i takhle:



delegate void mujDelegat();
event mujDelegat mojeUdalost = new mujDelegat(mojeMetoda());

A je také možné nechat implicitně vygenerovat delegát?


delegate void mujDelegat();
event mujDelegat mojeUdalost = mojeMetoda();

//Nedávám edit protože se mi zdá že je to až moc nesouvisející

Nahlásit jako SPAM
IP: 92.62.224.–
splite0
Newbie
5. 8. 2010   #5
-
0
-

To Petrroll :
Jenom drobnost... Je to starší vlákno ale proč to tu nechávat s chybou...

Správně je to takhle

delegate void mujDelegat();

event mujDelegat mojeUdalost = new mujDelegat(mojeMetoda);
a (nebo :) )
delegate void mujDelegat();

event mujDelegat mojeUdalost = mojeMetoda;
Prostě do ukazatele se nepíší parametry() - protože ty už jsou definované jako parametry delegáta a target musí být v parametrech totožný.

Nevím, jestli jsi to jenom nevynachal kvůli příkladu, ale pokud by se sem někdy někdo progooglil tak ať je to komplet: pozor na to
event mujDelegat mojeUdalost = new mujDelegat(mojeMetoda);
To si můžeš dovolit při inicializaci (vyhneš se NullReferenceException kdyby jsi vypálil event a neměl na něm žádného delegáta, většinou se ale event před vypálením kontroluje zda != null místo aby se na něj věšel prázdnej delegát...) jenže pokud by jsi na něj chtěl navěsit víc delegátů, jako třeba

delegate void mujDelegat();

event mujDelegat mojeUdalost;
// tělo metody:
mojeUdalost = mojeMetoda1; // nebo mojeUdalost = mujDelegat(mojeMetoda1);
mojeUdalost = mojeMetoda2; // atd
mojeUdalost = mojeMetoda3;
mojeUdalost(); // tím jsem vypálil event

tak se logicky provede pouze mojeMetoda3, protože první dvě jsou přepsány. Pokud chceš na event navěsit víc delegátů než jednoho (občas se to hodí :) Nakonec, je to přece event, ne? Jinak by stačila obyč proměnná s typem mujDelegat ) tak stačí = nahradit za +=

delegate void mujDelegat();

event mujDelegat mojeUdalost;
// tělo metody:
mojeUdalost += mojeMetoda1; // nebo mojeUdalost += mujDelegat(mojeMetoda1);
mojeUdalost += mojeMetoda2; // atd
mojeUdalost += mojeMetoda3;
mojeUdalost(); // tím jsem vypálil event

a teď proběhnou všechny tři metody.

Nahlásit jako SPAM
IP: 92.62.224.–
Petrroll0
Stálý člen
5. 8. 2010   #6
-
0
-

Jj, tohle mi bylo jasný, šlo mi o to jestli jde nechat implicitně vygenerovat delegát. Teď to vím. Díky za opravu tý chyby a celkově za vyčerpávající odpověď. Konečně chápu snad vše tak jak to opravdu je.

Nahlásit jako SPAM
IP: 92.62.224.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 34 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý