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ý typ. 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 prostřednictvím kódu programu 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 algoritmus řazení. Vzhledem k tomu, že srovnávací kód je oddělený od knihovny, může být metoda řazení obecnější.

Ukazatele na funkce byly přidány do jazyka C# 9 pro podobné scénáře, kde potřebujete větší kontrolu nad konvencí volání. Kód přidružený k delegátovi je vyvolán pomocí virtuální metody přidané do typu delegátu. Pomocí ukazatelů na funkce můžete zadat různé konvence.

Přehled delegátů

Delegáty mají následující vlastnosti:

  • Delegáti jsou podobné ukazatelům na funkce jazyka C++, ale delegáti jsou plně objektově orientovaní a na rozdíl od ukazatelů jazyka C++ na členské funkce zapouzdřují delegáty instanci objektu i 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átu. Další informace najdete v tématu Použití odchylek v delegátech.
  • Výrazy lambda jsou výstižnější způsob zápisu v podobě vtělých bloků kódu. Výrazy lambda (v určitých kontextech) jsou zkompilovány na typy delegátů. Další informace o výrazech lambda najdete v tématu Výrazy lambda.

V tomto oddílu

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#.

Viz také