Partager via


Délégués fortement typés

Précédent

Dans l’article précédent, vous avez vu que vous créez des types délégués spécifiques à l’aide du delegate mot clé.

La classe abstraite Delegate fournit l’infrastructure pour l’invocation et le couplage faible. Les types délégués concrets deviennent beaucoup plus utiles en adoptant et en appliquant la sécurité de type pour les méthodes qui sont ajoutées à la liste d’invocation d’un objet délégué. Lorsque vous utilisez le delegate mot clé et définissez un type de délégué concret, le compilateur génère ces méthodes.

Dans la pratique, cela entraînerait la création de nouveaux types de délégués chaque fois que vous avez besoin d’une signature de méthode différente. Ce travail pourrait être fastidieux après un certain temps. Chaque nouvelle fonctionnalité nécessite de nouveaux types de délégués.

Heureusement, cela n’est pas nécessaire. Le framework .NET Core contient plusieurs types que vous pouvez réutiliser chaque fois que vous avez besoin de types délégués. Il s’agit de définitions génériques qui vous permettent de déclarer des personnalisations lorsque vous avez besoin de nouvelles déclarations de méthode.

Le premier de ces types est le Action type et plusieurs variantes :

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.

Le in modificateur de l’argument de type générique est abordé dans l’article sur la covariance.

Il existe des variantes du Action délégué qui contiennent jusqu’à 16 arguments tels que Action<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16>. Il est important que ces définitions utilisent différents arguments génériques pour chacun des arguments délégués : cela vous offre une flexibilité maximale. Les arguments de méthode n’ont pas besoin d’être, mais peuvent être le même type.

Utilisez l’un des Action types pour n’importe quel type délégué qui a un type de retour void.

L’infrastructure inclut également plusieurs types de délégués génériques que vous pouvez utiliser pour les types délégués qui retournent des valeurs :

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

Le out modificateur de l’argument de type générique de résultat est abordé dans l’article sur la covariance.

Il existe des variantes du Func délégué avec jusqu’à 16 arguments d’entrée tels que Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,TResult>. Le type du résultat est toujours le dernier paramètre de type dans toutes les Func déclarations, par convention.

Utilisez l’un Func des types pour tout type délégué qui retourne une valeur.

Il existe également un type spécialisé Predicate<T> pour un délégué qui retourne un test sur une valeur unique :

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

Vous pouvez remarquer que pour n’importe quel Predicate type, un type structurellement équivalent Func existe par exemple :

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

Vous pensez peut-être que ces deux types sont équivalents. Ils ne le sont pas. Ces deux variables ne peuvent pas être utilisées de façon interchangeable. Une variable d’un type ne peut pas être affectée à l’autre type. Le système de type C# utilise les noms des types définis, et non la structure.

Toutes ces définitions de type délégué dans la bibliothèque .NET Core doivent signifier que vous n’avez pas besoin de définir un nouveau type de délégué pour toute nouvelle fonctionnalité que vous créez qui nécessite des délégués. Ces définitions génériques doivent fournir tous les types délégués dont vous avez besoin dans la plupart des situations. Vous pouvez simplement instancier l’un de ces types avec les paramètres de type requis. Dans le cas d’algorithmes pouvant être rendus génériques, ces délégués peuvent être utilisés comme types génériques.

Cela doit gagner du temps et réduire le nombre de nouveaux types que vous devez créer pour travailler avec des délégués.

Dans l’article suivant, vous verrez plusieurs modèles courants pour travailler avec des délégués dans la pratique.

Prochain