První novoroční výprodej Java týden
Hledáš brigádu v IT, která bude 100 % home office a 100 % flexibilní? Pak napiš na: redakce [zavináč] itnetwork.cz pro více info!
80 % bodů zdarma díky akci Black Friday! Tento týden rovněž sleva na e-learning Java až 80 %

Diskuze: C# události

Aktivity (4)
Avatar
Jiří Dvořák:17.11.2019 6:11

Jsou v C# události opravdu důležité (využívají se hojně)? nebo je to něco co se používá jen občas? protože nejsem zaboha schopnej je pochopit :D už se o to snažím 4. den a furt nic :D

 
Odpovědět
17.11.2019 6:11
Avatar
Reaktivní uživatel:17.11.2019 8:52

Používají se dost, ale základy bys měl zvládat i bez toho, že bys události chápal. Pokud ti můžu poradit, běž dál a vrať se k nim až když je budeš aspoň měsíc používat (tj. budeš si vědom, jak a kde se používají), pak by to pro tebe neměl být problém.

Nahoru Odpovědět
17.11.2019 8:52
Kdo je připraven, toho zaskočí něco jiného
Naši partneři možná hledají právě tebe!
Avatar
petr.brant
Člen
Avatar
Odpovídá na Jiří Dvořák
petr.brant:17.11.2019 15:08

Každé ťuknutí na čudlík, pohyb oknem apod. je událost. Takže se používají VELMI hojně. Ale tobě jde spíše o uživatelsky definované události, že. Princip je tento: Obsluha události je funkce, která se má vykonat, když událost nastane. Odkaz na tuhle funkci musíš nějak dostat tam, kde se má událost obsloužit. To se dá dělat různě, nejobvyklejší je to přes delegáta. Nevím, jestli víš, o co se jedná, pokud ne, představ si to jako pointer na funkci. Tu funkci, která zajišťuje obsluhu události. Samotná událost může být v podstatě cokoli tě napadne, třeba ztráta spojení s databází, nějaká nečekaná situace při zpracování dat, smrt postavy ve hře,apod. Základní syntaxe je tato:

public delegate void delegOnSmrt(object sender); ---> tím deklaruješ schéma funkce, která bude tvořit obsluhu události. Konkrétní obsluha bude za chvíli.

class Postava ---> to bude objekt, u kterého budeme vyvolávat událost(i)
{
        public event delegOnSmrt OnSmrt; ---> tímhle řekneš třídě, že bude mít k dispozici funkci OnSmrt a bude mít schéma delegOnSmrt, tj. bude vyžadovat při volání jako parametr nějaký object.

        .....

        if (Zdravi == 0)
        {
            if (OnSmrt != null)    ---> je třeba se ujistit, že ta funkce je skutečně k dispozici
                OnSmrt(this) ---> a v tom případě ji zavoláme a jako parametr předáme něco typu object, typicky pointer na u třídu, která událost vyvolala. Velmi užitečné, viz za chvíli.
        }
        ......

No a v hlavním programu, který zajišťuje celou logiku, by se mělo objevit toto:

drak = new Postava();
drak.OnSmrt += ObsluhaSmrtiPostavy; tím řekneme, že v případě události OnSmrt objektu drak se má provést funkce "ObsluhaSmrtiPostavy"
....
Honza = new Postava();
Honza.OnSmrt += ObsluhaSmrtiPostavy; tím řekneme, že v případě události OnSmrt objektu Honza se má provést tatáž funkce "ObsluhaSmrtiPostavy"
....

V obou případech se volá tatáž funkce ObsluhaSmrtiPos­tavy, takže v zásadě nelze rozlišit, která postava to vlastně špatně dopadla. Proto je tu parametr sender, ve kterém je zapsáno, kdo tu událost vyvolal a lze tak událost korektně obsloužit.

void ObsluhaSmrtiPostavy(object sender) ---> a tohle je ta funkce, která se má vykonat
{
      if (sender == drak)
      {
         (drak prohrál)        takže tady naprogramujeme oslavnou fanfáru
      }
      if (sender == Honza)
      {
         (Honza prohrál) a tady naprogramujeme, co se má stát, když drak vyhraje
      }
}

Teď je otázka, proč to dělat takhle. Velmi podobně je napsaný i .NET framework, například u třídy Button je napsáno, že vyvolává událost OnClick, ale samotná obsluha (tj. co se má stát po kliknutí) se už píše v tvém programu. Vše ostatní (optický efekt apod.) je napsané ve střevech .NET frameworku, na programátorovi zbyde jen obsluha.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět
17.11.2019 15:08
Avatar
Odpovídá na petr.brant
Jiří Dvořák:17.11.2019 19:24

Moc děkuji za vysvětlení. Konečně sem ty události pochopil :D vysvětlil jste mi to lépe než tutorial co je zde na webu.
Moc díky! :)

Edit:
jinak delegáty chápu.

Editováno 17.11.2019 19:26
 
Nahoru Odpovědět
17.11.2019 19:24
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.