Pouvez-vous m'expliquer ce que where T : class, new()
signifie la ligne de code suivante?
void Add<T>(T item) where T : class, new();
c#
generics
type-constraints
Rawhi
la source
la source
Réponses:
C'est une contrainte sur le paramètre générique
T
. Il doit être unclass
(type de référence) et doit avoir un constructeur par défaut public sans paramètre.Cela veut dire
T
ne peut pas être unint
,float
,double
,DateTime
ou tout autrestruct
(type de valeur).Il peut s'agir d'un
string
ou de tout autre type de référence personnalisé, tant qu'il possède un constructeur par défaut ou sans paramètre.la source
new()
précise précisément "doit avoir un constructeur public sans paramètre"Ce sont des contraintes de type génériques. Dans votre cas, il y en a deux:
Signifie que le type
T
doit être un type de référence (pas un type de valeur).Signifie que le type
T
doit avoir un constructeur sans paramètre. Avoir cette contrainte vous permettra de faire quelque chose commeT field = new T();
dans votre code que vous ne pourriez pas faire autrement.Vous combinez ensuite les deux à l'aide d'une virgule pour obtenir:
la source
où T: struct
L'argument type doit être un type valeur. Tout type de valeur, à l'exception de Nullable, peut être spécifié. Voir Utilisation de types Nullable (Guide de programmation C #) pour plus d'informations.
où T: classe
L'argument type doit être un type de référence, comprenant tout type de classe, d'interface, de délégué ou de tableau. (Voir note ci-dessous.)
où T: new () L'argument type doit avoir un constructeur public sans paramètre. Lorsqu'elle est utilisée conjointement avec d'autres contraintes, la nouvelle contrainte () doit être spécifiée en dernier.
où T: [nom de la classe de base]
L'argument type doit être ou dériver de la classe de base spécifiée.
où T: [nom de l'interface]
L'argument type doit être ou implémenter l'interface spécifiée. Plusieurs contraintes d'interface peuvent être spécifiées. L'interface contraignante peut également être générique.
où T: U
L'argument de type fourni pour T doit être ou dériver de l'argument fourni pour U. Cela s'appelle une contrainte de type nu.
la source
class
&new
sont 2 contraintes sur le paramètre de type génériqueT
.Respectivement, ils assurent:
class
new
Leur combinaison signifie que le type
T
doit être un type de référence (ne peut pas être un type de valeur ) et doit avoir un constructeur sans paramètre.Exemple:
la source
new (): La spécification de la contrainte new () signifie que le type T doit utiliser un constructeur sans paramètre, afin qu'un objet puisse en être instancié - voir Constructeurs par défaut .
classe: signifie que T doit être un type de référence, il ne peut donc pas être un entier, flottant, double, DateTime ou autre struct (type de valeur).
la source
Cela signifie que ce type
T
doit être une classe et avoir un constructeur qui ne prend aucun argument.Par exemple, vous devez pouvoir faire ceci:
la source
où (référence C #)
Il devrait donc être,
T
doit être une classe et avoir un constructeur accessible sans paramètre - ou par défaut.la source
Ce qui vient après le "Où" est une contrainte sur le type générique T que vous avez déclaré, donc:
classe signifie que le T doit être une classe et non un type de valeur ou une structure.
new () indique que la classe T devrait avoir un constructeur par défaut public sans paramètre défini.
la source
Cela s'appelle une «contrainte» sur le paramètre générique T. Cela signifie que T doit être un type de référence (une classe) et qu'il doit avoir un constructeur public par défaut.
la source
Cela fait partie du mécanisme Generics, où le mot-clé where ajoute des contraintes aux types à implémenter pour être utilisé comme paramètres de type.
la source
lorsque vous utilisez la classe dans des contraintes, cela signifie que vous ne pouvez utiliser que le type de référence, une autre chose à ajouter est quand utiliser la contrainte new () , ce doit être la dernière chose que vous écrivez dans les termes de contraintes.
la source