Maison  >  Article  >  développement back-end  >  Expliquer comment fonctionnent les génériques en C#

Expliquer comment fonctionnent les génériques en C#

WBOY
WBOYavant
2023-08-27 23:45:021003parcourir

解释泛型在 C# 中的工作原理

Les génériques ont été ajoutés dans la version 2.0 de C# et sont l'un des concepts les plus importants du langage. Ils vous permettent d'écrire du code réutilisable et hautes performances, de type sécurisé au moment de la compilation. Les génériques vous permettent d'utiliser un type dans votre code sans connaître le type au préalable.

Les génériques sont utilisés à de nombreux endroits dans .NET, notamment les collections, les délégués et le code asynchrone. Avec les génériques, vous n'avez pas besoin de connaître la taille de la collection à l'avance et vous pouvez utiliser des génériques avec n'importe quel type d'élément, même avec des types de données personnalisés spécifiques à votre code. C# prend en charge les types génériques (classes, interfaces, etc.) et les méthodes génériques.

Dans les génériques, vous avez des paramètres de type et des paramètres de type. Ceci est similaire à une méthode comportant des paramètres que vous pouvez transmettre à la méthode.

Types génériques

La syntaxe de déclaration d'un type générique se compose de paramètres de type entourés de crochets angulaires. Le nom du type. Par exemple, Locator est la classe générique dans l'exemple ci-dessous.

public class Locator<T>
{

}

Pour créer une instance de Locator, utilisez le nouveau mot-clé suivi du nom de la classe. Cependant, vous pouvez spécifier le type réel à passer en paramètre au lieu de T. L'exemple suivant transmet un type de chaîne en tant que paramètre.

var stringLocator = new Locator<string>();

Vous pouvez utiliser des paramètres de type (T) sur les méthodes de classe, comme indiqué dans l'exemple ci-dessous.

public class Locator{
   public IList Items { get; set; }

      public T Locate(int index){
      return Items[index];
   }
}
var stringLocator = new Locator<string>();
string item = stringLocator.Locate(2);

Un autre avantage des génériques est l'IntelliSense fourni par l'éditeur. Lorsque vous tapez stringLocator.Locate(4) dans Visual Studio ou VS Code et que vous survolez le nom de la méthode, cela indique qu'elle renvoie une chaîne au lieu d'un T. Le compilateur générera une erreur si vous essayez d'attribuer le résultat à un type autre qu'une chaîne. Par exemple, lorsque

// Error: Cannot implicitly convert type &#39;string&#39; to &#39;int&#39; [c-sharp]csharp(CS0029)
int item = stringLocator.Locate(2);

hérite d'un type de base générique ou d'une interface générique, le type générique peut utiliser des paramètres de type comme arguments de type. Le type générique LinkedList implémente l'interface générique IEnumerable ainsi que d'autres interfaces.

public class LinkedList<T> : IEnumerable<T>

Méthodes génériques

Une méthode générique est simplement une méthode qui déclare un paramètre de type que vous pouvez utiliser dans une méthode et l'utiliser comme paramètre et type de retour. Dans l'exemple suivant, Swap est une méthode générique qui prend deux paramètres de type T et renvoie une instance de T .

public class Swapper{
   public T Swap<T>(T first, T second){
      T temp = first;
      first = second;
      second = temp;
      return temp;
   }
}

Comme les types génériques, lorsque vous appelez une méthode générique, elle renverra une variable fortement typée.

var swapper = new Swapper();
int result = swapper.Swap<int>(5, 3);

peut avoir plusieurs paramètres généraux. La classe Dictionary dans l'espace de noms System.Collections.Generic a deux paramètres de type, key et value.

public class Dictionary<TKey, TValue>

Enfin, il est important de comprendre ce qui est universel. Pour les types, tout peut être générique sauf les énumérations. Ceux-ci incluent -

  • Classes
  • Structures
  • Interfaces
  • Délégués

Pour les membres de type, seules les méthodes et les types imbriqués peuvent être génériques. Les membres suivants ne peuvent pas être génériques -

  • Fields
  • Properties
  • Indexer
  • Constructor li>
  • Events
  • Terminator

Example

Live Demo

using System;
using System.Collections.Generic;
class Program{
   static void Main(){
      var stringLocator = new Locator<string>(){
         Items = new string[] { "JavaScript", "CSharp", "Golang" }
      };
      string item = stringLocator.Locate(1);
      Console.WriteLine(item); // CSharp
      var swapper = new Swapper();
      int a = 5, b = 3;
      int result = swapper.Swap<int>(ref a, ref b);
      Console.WriteLine($"a = {a}, b = {b}");
   }
}
public class Locator<T>{
   public IList<T> Items { get; set; }
   public T Locate(int index){
      return Items[index];
   }
}
public class Swapper{
   public T Swap<T>(ref T first, ref T second){
      T temp = first;
      first = second;
      second = temp;
      return temp;
   }
}

Output

CSharp
a = 3, b = 5

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer