web-dev-qa-db-fra.com

Que signifie <T> en C #

Je suis nouveau dans C # et je me lance directement dans la modification de code pour un projet que j'ai reçu. Cependant, je continue à voir le code comme ceci:

class SampleCollection<T>

et je ne peux pas comprendre ce que le

<T> 

signifie ni comment il s'appelle.

Si quelqu'un souhaite m'aider à nommer le nom de ce concept, je peux le rechercher en ligne. Cependant, je suis désemparé à partir de maintenant.

75
Yash Desai

C'est un paramètre de type générique .

Un paramètre de type générique vous permet de spécifier un type arbitraire T à une méthode au moment de la compilation, sans spécifier de type concret dans la déclaration de la méthode ou de la classe.

Par exemple:

public T[] Reverse<T>(T[] array)
{
    var result = new T[array.Length];
    int j=0;
    for(int i=array.Length - 1; i>= 0; i--)
    {
        result[j] = array[i];
        j++;
    }
    return result;
}

inverse les éléments d'un tableau. Le point clé ici est que les éléments du tableau peuvent être de n'importe quel type et que la fonction fonctionnera toujours. Vous spécifiez le type dans l'appel de méthode; Le type de sécurité est toujours garanti.

Donc, pour inverser un tableau de chaînes:

string[] array = new string[] { "1", "2", "3", "4", "5" };
var result = reverse(array);

Produira un tableau de chaînes dans result sur { "5", "4", "3", "2", "1" }

Cela a le même effet que si vous aviez appelé une méthode ordinaire (non générique) qui ressemble à ceci:

public string[] Reverse(string[] array)
{
    var result = new string[array.Length];
    int j=0;
    for(int i=array.Length - 1; i >= 0; i--)
    {
        result[j] = array[i];
        j++;
    }
    return result;
}

Le compilateur voit que array contient des chaînes, il renvoie donc un tableau de chaînes. Le type string remplace le paramètre T type.


Les paramètres de type générique peuvent également être utilisés pour créer des classes génériques. Dans l'exemple que vous avez donné d'un SampleCollection<T>, le T est un espace réservé pour un type arbitraire; cela signifie que SampleCollection peut représenter une collection d'objets, dont vous spécifiez le type lors de la création de la collection.

Alors:

var collection = new SampleCollection<string>();

crée une collection pouvant contenir des chaînes. La méthode Reverse illustrée ci-dessus, sous une forme quelque peu différente, peut être utilisée pour inverser les membres de la collection.

97
Robert Harvey

C'est un paramètre de type générique, voir Génériques documentation .

T n'est pas un mot clé réservé. T, ou tout autre nom, désigne un paramètre de type. Vérifiez la méthode suivante (juste à titre d'exemple).

T GetDefault<T>()
{
    return default(T);
}

Notez que le type de retour est T. Avec cette méthode, vous pouvez obtenir la valeur par défaut de tout type en appelant la méthode comme suit:

GetDefault<int>(); // 0
GetDefault<string>(); // null
GetDefault<DateTime>(); // 01/01/0001 00:00:00
GetDefault<TimeSpan>(); // 00:00:00

.NET utilise des génériques dans des collections, ... exemple:

List<int> integerList = new List<int>();

Ainsi, vous aurez une liste qui accepte uniquement les entiers, car la classe est instanciée avec le type T, dans ce cas int, et la méthode qui ajoute des éléments s’écrit comme suit:

public class List<T> : ...
{
    public void Add(T item);
}

Quelques informations supplémentaires sur les génériques.

Vous pouvez limiter la portée du type T.

L'exemple suivant vous permet uniquement d'appeler la méthode avec des types qui sont des classes:

void Foo<T>(T item) where T: class
{
}

L'exemple suivant vous permet uniquement d'appeler la méthode avec des types Circle ou d'en hériter.

void Foo<T>(T item) where T: Circle
{
}

Et il y a new() qui dit que vous pouvez créer une instance de T si elle a un constructeur sans paramètre. Dans l'exemple suivant, T sera traité comme Circle, vous obtenez intellisense ...

void Foo<T>(T item) where T: Circle, new()
{
    T newCircle = new T();
}

Comme T est un paramètre de type, vous pouvez en obtenir l'objet Type. Avec le Type, vous pouvez utiliser la réflexion ...

void Foo<T>(T item) where T: class
{
    Type type = typeof(T);
}

Comme exemple plus complexe, vérifiez la signature de ToDictionary ou de toute autre méthode Linq.

public static Dictionary<TKey, TSource> ToDictionary<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector);

Il n'y a pas de T, cependant il y a TKey et TSource. Il est recommandé de toujours nommer les paramètres de type avec le préfixe T comme indiqué ci-dessus.

Vous pouvez nommer TSomethingFoo si vous le souhaitez.

22
BrunoLM

Cette fonctionnalité est appelée générique. http://msdn.Microsoft.com/en-us/library/512aeb7t (v = vs.100) .aspx

Un exemple de cela est de faire une collection d'éléments d'un type spécifique.

class MyArray<T>
{
    T[] array = new T[10];

    public T GetItem(int index)
    {
        return array[index];
    }
}

Dans votre code, vous pouvez alors faire quelque chose comme ceci:

MyArray<int> = new MyArray<int>();

Dans ce cas, T[] array fonctionnerait comme int[] array, et public T GetItem fonctionnerait comme public int GetItem.

8
Kendall Frey