Sdílet prostřednictvím


Použití delegátů (Průvodce programováním v C#)

Objekt delegovat je typu, který zapouzdřuje bezpečně metodu, podobně jako ukazatel funkce jazyka C a C++.Na rozdíl od ukazatelů funkcí C Delegáti jsou objektově orientované, zadejte bezpečné a zabezpečené.Jméno delegáta je definován typ delegáta.Následující příklad deklaruje delegáta s názvem Del , můžete zapouzdřit metodu, která přebírá řetězec jako argument a vrátí hodnotu void:

public delegate void Del(string message);

Objekt delegáta obvykle vytvořen pomocí poskytující název metody, budou zahrnovat delegáta, nebo s anonymní metody.Poté, co je vytvořena instance delegáta, budou předány provedené delegát volání metody delegátem k této metodě.Parametry předán delegáta volajícího jsou předaný metodě a návratovou hodnotu, pokud existuje, metoda vrátí zpět do volající delegátem.Toto se označuje jako volání delegát.Instance delegáta mohou být vyvolány, jako kdyby nebylo zabalená metoda sama.Příklad:

// Create a method for a delegate. 
public static void DelegateMethod(string message)
{
    System.Console.WriteLine(message);
}
// Instantiate the delegate.
Del handler = DelegateMethod;

// Call the delegate.
handler("Hello World");

Delegát typy jsou odvozeny z Delegate třídy v rozhraní .NET Framework.Delegát typy jsou zapečetěnou– nemůže být odvozena z – a není možné odvodit vlastní třídy z Delegate.Vzhledem k tomu, že instance delegáta je objekt, může být předána jako parametr, nebo přiřazeny vlastnosti.To umožňuje metoda přijmete delegáta jako parametr a volání delegát později.To se označuje jako asynchronního zpětného volání a je společná metoda upozornění volajícího po dokončení dlouhého procesu aplikace.Při delegáta slouží tímto způsobem, kód pomocí delegát není nutné žádnou znalost jazyka implementace metody používán.Funkce se podobá zapouzdření, které poskytují rozhraní.

Dalším běžným použitím zpětných volání je definovat metodu vlastní porovnání a předávání tohoto delegáta metoda řazení.To umožňuje používat volajícího kódu se stanou součástí algoritmus řazení.Následující příklad metoda používá Del typ jako parametr:

public void MethodWithCallback(int param1, int param2, Del callback)
{
    callback("The number is: " + (param1 + param2).ToString());
}

Potom můžete předat delegáta vytvořili výše k této metodě:

MethodWithCallback(1, 2, handler);

a zobrazit v konzole následující:

The number is: 3

Použití delegát jako abstrakci, MethodWithCallback není nutné volat konzoly přímo – nemá být navržen s konzolou v paměti.Co MethodWithCallback nemá je jednoduše připravit řetězec a předejte řetězec na jinou metodu.Toto je obzvláště efektivní vzhledem k tomu, že delegovaný metodu můžete použít libovolný počet parametrů.

Když se k zabalení metodu instance delegáta, delegát odkazuje na instanci a metody.Delegát nezná instance typu bez ohledu na metodu, kterou se zabalí, takže delegáta mohou odkazovat na libovolný typ objektu, jako je metoda na tento objekt, který odpovídá delegáta.Když se k zabalení statickou metodu delegáta, pouze odkazuje na metodu.Vezměte v úvahu následující deklarace:

public class MethodClass
{
    public void Method1(string message) { }
    public void Method2(string message) { }
}

Spolu se statickou DelegateMethod dříve uvedeny, nyní je k dispozici tři metody, které může být zabalen Del instance.

Delegát můžete volat více než jedna metoda po vyvolání.To se nazývá vícesměrové vysílání.Chcete-li přidat další metody delegáta seznam metod – seznamu vyvolání – jednoduše vyžaduje přidání dva delegáty pomocí přidávání nebo operátory přiřazení sčítání ('+' nebo '+').Příklad:

MethodClass obj = new MethodClass();
Del d1 = obj.Method1;
Del d2 = obj.Method2;
Del d3 = DelegateMethod;

//Both types of assignment are valid.
Del allMethodsDelegate = d1 + d2;
allMethodsDelegate += d3;

V tomto okamžiku allMethodsDelegate obsahuje tři metody, které ve svém seznamu volání –Method1, Method2, a DelegateMethod.Původní tři delegáty, d1, d2, a d3, zůstanou nezměněna.Při allMethodsDelegate je volána, všechny tři metody jsou volány ve správném pořadí.Pokud delegát používá parametry odkaz, odkaz je předán postupně na každý ze tří způsobů zase a jakékoli změny jednoho metodou se projeví na další metodu.Když všem metodám vyvolá výjimku, která není zachycena v rámci metody, že výjimky je předán do volajícího delegáta a žádná z následujících metod v seznamu vyvolání se nazývají.Pokud delegát má návratovou hodnotu a/nebo výstupní parametry, vrátí návratovou hodnotu a parametry poslední vyvolání metody.Chcete-li odebrat metodu ze seznamu volání, použijte snížení hodnoty nebo sníží operátor přiřazení ("-" nebo "'-='").Příklad:

//remove Method1
allMethodsDelegate -= d1;

// copy AllMethodsDelegate while removing d2
Del oneMethodDelegate = allMethodsDelegate - d2;

Vzhledem k tomu, že delegát typy jsou odvozeny od System.Delegate, metody a vlastnosti, které třída definuje lze volat na delegáta.Můžete například vyhledat počet metod v seznamu vyvolání tohoto delegáta, můžete zadat:

int invocationCount = d1.GetInvocationList().GetLength(0);

Delegáti s více než jednu metodu do svého seznamu volání jsou odvozeny od MulticastDelegate, který je podtřídou třídy System.Delegate.Ve výše uvedeném kódu pracuje v obou případech vzhledem k tomu, že oba třídy podporují GetInvocationList.

Vícesměrového vysílání delegáty jsou používány ve zpracování událostí.Objekty zdroje událostí odeslat oznámení o událostech příjemce objekty, které jste zaregistrováni k odběru této události.Chcete-li zaregistrovat pro událost, příjemce vytvoří metodu určené ke zpracování události, pak vytvoří delegáta pro danou metodu a předá delegát zdroj události.Zdroj volá delegáta, jakmile dojde k události.Delegát poté zavolá metodu na příjemce, poskytování data události zpracování událostí.Zdroj události je definován typ delegáta pro danou událost.Další informace naleznete v tématu Události (Průvodce programováním v C#).

Porovnání delegáty ze dvou různých typů, které jsou přiřazeny v době kompilace bude mít za následek chybu kompilace.Pokud delegát instance jsou staticky typu System.Delegate, pak je povolen porovnání, ale bude spuštěna návratovou hodnotu false na čas.Příklad:

delegate void Delegate1();
delegate void Delegate2();

static void method(Delegate1 d, Delegate2 e, System.Delegate f)
{
    // Compile-time error. 
    //Console.WriteLine(d == e); 

    // OK at compile-time. False if the run-time type of f  
    // is not the same as that of d.
    System.Console.WriteLine(d == f);
}

Viz také

Referenční dokumentace

Delegáti (Průvodce programováním v C#)

Použití odchylek v delegátech (C# and Visual Basic)

Použití odchylek pro obecné delegáty Func a Action (C# and Visual Basic)

Události (Průvodce programováním v C#)

Koncepty

Průvodce programováním v C#

Odchylky v delegátech (C# and Visual Basic)