Introduction aux génériques C #
Alors, quel est le concept des génériques en C #? En termes simples, il s'agit du concept de définition de classes, interfaces, méthodes, délégués, propriétés indépendants du type. Cela signifie que vous pouvez définir une classe générique ou un corps de méthode et fournir le type réel lors de l'appel.
Ainsi, les génériques sont comme des modèles de code. Ils vous permettent d'écrire un bloc de code de type sécurisé sans faire référence à un type de données particulier. Le type de votre code est déterminé au moment de la compilation lors de l'appel d'appel pour votre classe ou méthode.
Syntaxe des génériques en C #
Regardons la syntaxe d'une déclaration générique en C #. C'est une syntaxe très simple.
Comme pratique courante, la lettre «T», en majuscule et entre crochets angulaires, désigne la déclaration d'un code générique en C #. Mais ce n'est pas le mandat. Toute lettre en majuscule placée entre crochets angulaires peut être utilisée pour désigner un code générique.
Déclaration d'une classe générique:
public class MyGenericClass
Instanciation d'une classe générique:
MyGenericClass = new MyGenericClass();
Déclaration d'une classe dérivée générique:
public class MyGenericDerivedClass : MyGenericBaseClass
Déclaration d'une méthode générique:
public T MyGenericMethod(T item);
Comment fonctionnent les génériques en C #?
Lorsque vous déclarez un code générique en C #, le compilateur produit un modèle équivalent à ce code. Ce modèle est vérifié pour toutes les erreurs de compilation sauf la sécurité de type. L'étape suivante survient lorsque le code générique est appelé ou appelé dans une autre partie du programme. Au moment de l'appel, vous spécifiez le type avec lequel votre code générique serait compilé. Lorsque le compilateur atteint le point d'invocation, il insère le type spécifié dans le modèle précédemment compilé. Il est ensuite recompilé pour vérifier la sécurité du type. Une fois passé, le code est prêt à être exécuté.
Nous verrions le code compilé dans les exemples ci-dessous pour mieux comprendre les modèles génériques.
Exemple de génériques en C #
Voici les différents exemples de génériques C #:
Génériques avec classe
Code:
using System;
using System.Collections.Generic;
public class GenericClass
(
List genericList;
public GenericClass()
(
genericList = new List();
)
public void AddToList(T item)
(
genericList.Add(item);
)
public void DisplayList()
(
foreach (var ele in genericList)
(
Console.Write("(0)\t", ele);
)
)
)
public class Program
(
public static void Main()
(
GenericClass intGenericObj = new GenericClass();
GenericClass stringGenericObj = new GenericClass();
intGenericObj.AddToList(28);
intGenericObj.AddToList(999);
intGenericObj.AddToList(0);
intGenericObj.AddToList(-123);
intGenericObj.AddToList(100);
stringGenericObj.AddToList("Hello");
stringGenericObj.AddToList("Bonjour");
stringGenericObj.AddToList("Ola");
stringGenericObj.AddToList("Ciao");
stringGenericObj.AddToList("Hallo");
intGenericObj.DisplayList();
Console.WriteLine("\n");
stringGenericObj.DisplayList();
))
Production:
Le même code peut également être réécrit comme ci-dessous. Cela illustre le pouvoir de définir une classe générique qui peut être sécurisée pour plusieurs types dans un même objet.
using System;
using System.Collections.Generic;
public class GenericClass
(
List genericList1;
List genericList2;
public GenericClass()
(
genericList1 = new List();
genericList2 = new List();
)
public void AddToList(T item1, U item2)
(
genericList1.Add(item1);
genericList2.Add(item2);
)
public void DisplayList()
(
foreach (var ele in this.genericList1)
(
Console.Write("(0)\t", ele);
)
Console.WriteLine("\n");
foreach (var ele in this.genericList2)
(
Console.Write("(0)\t", ele);
)
)
)
public class Program
(
public static void Main()
(
GenericClass genericObj = new GenericClass();
genericObj.AddToList(28, "Hello");
genericObj.AddToList(999, "Bonjour");
genericObj.AddToList(0, "Ola");
genericObj.AddToList(-123, "Ciao");
genericObj.AddToList(100, "Hallo");
genericObj.DisplayList();
)
)
Production:
Code compilé:
Pour avoir une idée de la façon dont le type de données est résolu dans Generics, examinons le code compilé généré lorsque nous instancions la classe avec des types entiers et chaîne dans l'exemple ci-dessus.
using System;
using System.Collections.Generic;
public class GenericClass
(
List genericList1;
List genericList2;
public GenericClass()
(
genericList1 = new List();
genericList2 = new List();
)
public void AddToList(int item1, string item2)
(
genericList1.Add(item1);
genericList2.Add(item2);
)
public void DisplayList()
(
foreach (var ele in this.genericList1)
(
Console.Write("(0)\t", ele);
)
Console.WriteLine("\n");
foreach (var ele in this.genericList2)
(
Console.Write("(0)\t", ele);
)
)
)
public class Program
(
public static void Main()
(
GenericClass genericObj = new GenericClass();
genericObj.AddToList(28, "Hello");
genericObj.AddToList(999, "Bonjour");
genericObj.AddToList(0, "Ola");
genericObj.AddToList(-123, "Ciao");
genericObj.AddToList(100, "Hallo");
genericObj.DisplayList();
)
)
Génériques avec méthode
Code:
using System;
using System.Collections.Generic;
public class Program
(
public static void Main()
(
int() intArr = (12, 23, 43, 94, 35);
double() doubleArr = (12.3, 45.6, 98.7, 1.45, 82.653);
string() strArr = ("Hello", "Bonjour", "Ola", "Ciao", "Hallo");
Console.WriteLine("The largest integer in the array is (0)", findMax(intArr));
Console.WriteLine("The largest floating-point number in the array is (0)", findMax(doubleArr));
Console.WriteLine("The largest string in the array is (0)", findMax(strArr));
)
static T findMax(T() items)
where T : IComparable
(
T max = items(0);
int position = 0;
for (int i = 1; i < items.Length; i++)
(
if (items(i).CompareTo(max) > 0)
(
max = items(i);
position = i;
)
)
return max;
)
)
Production:
L'espace de noms System.Collections.Generic
L'espace de noms System.Collections.Generic en C # contient des interfaces et des classes définissant les collections génériques. Ils permettent aux programmeurs de créer des collections génériques plus performantes et aussi fortement typées que les collections non génériques.
Cet espace de noms contient des listes, des dictionnaires, des listes liées, des hachages, des paires de valeurs-clés, des piles, etc., tous de nature générique. Les programmeurs peuvent les implémenter dans leur code.
Importance des génériques C #
Voici l'importance des génériques C # comme suit:
- Les génériques permettent la réutilisation du code: le principe fondamental d'une bonne programmation. Vous n'avez pas besoin d'écrire le même code pour chaque type de données attendu. Vous définissez simplement un code indépendant du type et indiquez au compilateur que le type de données réel serait fourni au moment de l'appel du code.
- Empêcher le coût de la boxe et de la dé-boxe: bien sûr, l'utilisation de génériques peut être contournée via la classe d'objets. Les deux codes ci-dessous sont équivalents dans leurs tâches.
Code générique: public T MyFunc (élément T);
Code non générique: objet public MyFunc (élément d'objet)
La classe d'objet remplace toutes les classes et donc le code non générique ci-dessus peut également être utilisé pour générer des modèles de code indépendants du type.
Mais, il existe un énorme écart de performances entre les deux codes. L'utilisation de la classe d'objets entraîne un coût supplémentaire de mise en boîte et de décompression des types de données. Les génériques éliminent cela et ont donc de meilleures performances.
Conclusion
Ainsi, nous avons vu à quel point les génériques sont une fonctionnalité de programmation incontournable. Il s'agit d'un concept très utile, non seulement en C # mais dans la plupart des langages de programmation modernes.
De plus, il est fortement recommandé d'en savoir plus sur l'espace de noms System.Collections.Generic en C #. De plus, pour comprendre les performances des génériques, plongez dans la façon dont la boxe et le déballage ont un impact sur la mémoire ainsi que sur le temps d'exécution.
Articles recommandés
Ceci est un guide des génériques C #. Ici, nous discutons de l'importance et du fonctionnement des génériques en C # ainsi que différents exemples et implémentations de code. Vous pouvez également consulter nos autres articles suggérés pour en savoir plus -
- Comparaison directe de C # ou d'opérateur
- Surcharge et redéfinition en Java
- Quelle est l'utilisation de la surcharge de méthode?
- Comment fonctionne la classe scellée en C #?
- Types et gestion des erreurs en JavaScript
- Collections PL / SQL | Syntaxe, types, exceptions