Sdílet prostřednictvím


Delegáty se silnými typy

Předchozí

V předchozím článku jste viděli, že pomocí klíčového slova vytvoříte konkrétní typy delegátů delegate .

Abstraktní třída Delegate poskytuje infrastrukturu pro volné párování a vyvolání. Konkrétní typy delegátů jsou mnohem užitečnější tím, že přijímají a vynucují bezpečnost typů pro metody přidané do seznamu vyvolání objektu delegáta. Když použijete delegate klíčové slovo a definujete konkrétní typ delegáta, kompilátor tyto metody vygeneruje.

V praxi by to vedlo k vytvoření nových typů delegátů vždy, když potřebujete jiný podpis metody. Tato práce by po nějaké době mohla být zdlouhavá. Každá nová funkce vyžaduje nové typy delegátů.

Naštěstí to není nutné. Rozhraní .NET Core obsahuje několik typů, které můžete opakovaně použít, kdykoli potřebujete typy delegátů. Jedná se o obecné definice, takže můžete deklarovat vlastní nastavení, když potřebujete nové deklarace metody.

První z těchto typů je Action typ a několik variant:

public delegate void Action();
public delegate void Action<in T>(T arg);
public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2);
// Other variations removed for brevity.

in Modifikátor argumentu obecného typu je popsán v článku o kovarianci.

Existují varianty delegáta Action , které obsahují až 16 argumentů, jako Action<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16>je . Je důležité, aby tyto definice používaly pro každý z argumentů delegáta různé obecné argumenty: To vám dává maximální flexibilitu. Argumenty metody nemusí být, ale mohou být stejného typu.

Použijte jeden z Action typů pro libovolný typ delegáta, který má návratový typ void.

Architektura obsahuje také několik obecných typů delegátů, které můžete použít pro typy delegátů, které vracejí hodnoty:

public delegate TResult Func<out TResult>();
public delegate TResult Func<in T1, out TResult>(T1 arg);
public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);
// Other variations removed for brevity

out Modifikátor argumentu obecného typu výsledku je popsán v článku o kovarianci.

Existují varianty delegáta Func s až 16 vstupními argumenty, jako Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,TResult>je . Typ výsledku je vždy posledním parametrem typu ve všech Func deklaracích podle konvence.

Pro libovolný typ delegáta Func , který vrací hodnotu, použijte jeden z typů.

Existuje také specializovaný Predicate<T> typ delegáta, který vrací test na jedné hodnotě:

public delegate bool Predicate<in T>(T obj);

Můžete si všimnout, že pro jakýkoli Predicate typ existuje strukturální ekvivalentní Func typ, například:

Func<string, bool> TestForString;
Predicate<string> AnotherTestForString;

Možná si myslíte, že tyto dva typy jsou ekvivalentní. Ne. Tyto dvě proměnné nelze zaměnitelně. Proměnnou jednoho typu nelze přiřadit druhý typ. Systém typů jazyka C# používá názvy definovaných typů, nikoli struktury.

Všechny tyto definice typů delegátů v knihovně .NET Core by měly znamenat, že nemusíte definovat nový typ delegáta pro žádnou novou funkci, kterou vytvoříte, která vyžaduje delegáty. Tyto obecné definice by měly poskytovat všechny typy delegátů, které potřebujete ve většině situací. Můžete jednoduše vytvořit instanci jednoho z těchto typů s požadovanými parametry typu. V případě algoritmů, které mohou být obecné, lze tyto delegáty použít jako obecné typy.

To by mělo ušetřit čas a minimalizovat počet nových typů, které potřebujete vytvořit, aby bylo možné pracovat s delegáty.

V dalším článku uvidíte několik běžných vzorů pro práci s delegáty v praxi.

Další