Delegáti (Průvodce programováním v C#)
Delegát je typ, který představuje odkazy na metody s konkrétním seznamem parametrů a návratovým typem. Pokud vytvoříte instanci delegátu, můžete příslušnou instanci přidružit s jakoukoli metodou s kompatibilním podpisem a návratovým typem. Metodu můžete vyvolat (nebo volat) prostřednictvím instance delegátu.
Delegáty se používají pro předávání metod jako argumentů jiným metodám. Ovladače událostí nejsou nic jiného než metody, které jsou vyvolány prostřednictvím delegátů. Můžete vytvořit vlastní metodu a konkrétní třída, jako je ovládací prvek Windows, může volat vaši metodu, pokud dojde k určité události. Následující příklad znázorňuje deklaraci delegátu.
public delegate int PerformCalculation(int x, int y);
Delegátu lze přiřadit jakoukoli metodu z jakékoli přístupné třídy nebo struktury odpovídající typu delegátu. Metoda může být buď statická, anebo se jedná o metodu instance. Tato flexibilita znamená, že můžete programově změnit volání metod nebo připojit nový kód do existujících tříd.
Poznámka
V kontextu přetížení metody nezahrnuje podpis metody návratovou hodnotu. V kontextu delegátů však podpis zahrnuje návratovou hodnotu. Jinými slovy to znamená, že metoda musí mít stejný návratový typ jako delegát.
Díky této možnosti odkazovat na metodu jako parametr jsou delegáty ideální pro definování metod zpětného volání. Můžete napsat metodu, která porovnává dva objekty v aplikaci. Tuto metodu lze použít v delegátu pro algoritmu řazení. Vzhledem k tomu, že porovnávací kód je oddělený od knihovny, může být metoda řazení obecnější.
Ukazatele funkcí byly přidány do C# 9 pro podobné scénáře, kde potřebujete větší kontrolu nad konvencí volání. Kód přidružený k delegátu se vyvolá pomocí virtuální metody přidané do typu delegáta. Pomocí ukazatelů funkcí můžete zadat různé konvence.
Přehled delegátů
Delegáty mají následující vlastnosti:
- Delegáti jsou podobné ukazatelům funkcí jazyka C++, ale delegáti jsou plně objektově orientované a na rozdíl od ukazatelů jazyka C++ na členské funkce zapouzdřují delegáty jak instanci objektu, tak metodu.
- Delegáty umožňují předávání metod jako parametrů.
- Delegáty lze použít pro definování metod zpětného volání.
- Delegáty lze zřetězit; například je možné volat větší počet metod v rámci jediné události.
- Metody nemusí přesně odpovídat typu delegáta. Další informace najdete v tématu Použití odchylky v delegátech.
- Výrazy lambda jsou stručnější způsob psaní vložených bloků kódu. Výrazy lambda (v určitých kontextech) se kompilují na typy delegátů. Další informace ovýrazch
V tomto oddílu
- Použití delegátů
- Kdy používat delegáty místo rozhraní (Průvodce programováním v C#)
- Delegáti s pojmenovanými vs. Anonymní metody
- Použití odchylek v delegátech
- Kombinování delegátů (delegátů vícesměrového vysílání)
- Jak deklarovat, vytvořit instanci a používat delegáta
Specifikace jazyka C#
Další informace najdete v tématu Delegáti ve specifikaci jazyka C#. Specifikace jazyka je úplným a rozhodujícím zdrojem pro syntaxi a použití jazyka C#.
Doporučené kapitoly knihy
- Delegáti, události a výrazy lambda v kuchařce C# 3.0, třetí edice: Více než 250 řešení pro programátory C# 3.0
- Delegáti a události v Učení C# 3.0: Základy jazyka C# 3.0