Können Sie mir bitte erklären, was where T : class, new()
in der folgenden Codezeile bedeutet?
void Add<T>(T item) where T : class, new();
c#
generics
type-constraints
Rawhi
quelle
quelle
Antworten:
Dies ist eine Einschränkung für den generischen Parameter
T
. Es muss einclass
(Referenztyp) sein und einen öffentlichen parameterlosen Standardkonstruktor haben.Das bedeutet
T
nicht sein kannint
,float
,double
,DateTime
oder jede anderestruct
(value - Typ).Es kann sich um einen
string
oder einen anderen benutzerdefinierten Referenztyp handeln, sofern er einen Standardkonstruktor oder einen parameterlosen Konstruktor hat.quelle
new()
spezifiziert genau "muss einen öffentlichen parameterlosen Konstruktor haben"Dies sind generische Typeinschränkungen. In Ihrem Fall gibt es zwei davon:
Bedeutet, dass der Typ
T
ein Referenztyp sein muss (kein Werttyp).Bedeutet, dass der Typ
T
einen parameterlosen Konstruktor haben muss. Mit dieser Einschränkung können Sie so etwas wieT field = new T();
in Ihrem Code tun, was Sie sonst nicht tun könnten.Sie kombinieren die beiden dann mit einem Komma, um Folgendes zu erhalten:
quelle
wo T: struct
Das Typargument muss ein Werttyp sein. Jeder Werttyp außer Nullable kann angegeben werden. Weitere Informationen finden Sie unter Verwenden nullbarer Typen (C # -Programmierhandbuch).
wo T: Klasse
Das Typargument muss ein Referenztyp sein, einschließlich aller Klassen-, Schnittstellen-, Delegaten- oder Arraytypen. (Siehe Anmerkung unten.)
Dabei ist T: new () Das Argument type muss einen öffentlichen parameterlosen Konstruktor haben. In Verbindung mit anderen Einschränkungen muss die neue () Einschränkung zuletzt angegeben werden.
wobei T: [Name der Basisklasse]
Das Typargument muss von der angegebenen Basisklasse sein oder von dieser abgeleitet sein.
wo T: [Schnittstellenname]
Das Typargument muss die angegebene Schnittstelle sein oder diese implementieren. Es können mehrere Schnittstellenbeschränkungen angegeben werden. Die einschränkende Schnittstelle kann auch generisch sein.
wo T: U.
Das für T angegebene Typargument muss das für U angegebene Argument sein oder von diesem abgeleitet sein. Dies wird als nackte Typbeschränkung bezeichnet.
quelle
class
&new
sind zwei Einschränkungen für den generischen TypparameterT
.Sie stellen jeweils sicher:
class
new
Ihre Kombination bedeutet, dass der Typ
T
ein Referenztyp sein muss (kann kein Werttyp sein ) und einen parameterlosen Konstruktor haben muss.Beispiel:
quelle
new (): Wenn Sie die Einschränkung new () angeben, muss Typ T einen parameterlosen Konstruktor verwenden, damit ein Objekt daraus instanziiert werden kann - siehe Standardkonstruktoren .
Klasse: Bedeutet, dass T ein Referenztyp sein muss, damit es sich nicht um eine int-, float-, double-, DateTime- oder andere Struktur (Werttyp) handeln kann.
quelle
Das bedeutet, dass type
T
eine Klasse sein und einen Konstruktor haben muss, der keine Argumente akzeptiert.Zum Beispiel müssen Sie dazu in der Lage sein:
quelle
wo (C # Referenz)
So sollte es sein,
T
muss eine Klasse sein und einen zugänglichen parameterlosen - oder Standardkonstruktor haben.quelle
Was nach dem "Wo" kommt, ist eine Einschränkung für den von Ihnen deklarierten generischen Typ T, also:
Klasse bedeutet, dass das T eine Klasse und kein Werttyp oder eine Struktur sein sollte.
new () gibt an, dass für die T-Klasse ein öffentlicher parameterfreier Standardkonstruktor definiert sein sollte.
quelle
Es wird als 'Einschränkung' für den generischen Parameter T bezeichnet. Dies bedeutet, dass T ein Referenztyp (eine Klasse) sein und einen öffentlichen Standardkonstruktor haben muss.
quelle
Dies ist Teil des Generics-Mechanismus, bei dem das Schlüsselwort where Einschränkungen hinzufügt, welche Typen implementiert werden müssen, um als Typparameter verwendet zu werden.
quelle
Wenn Sie die Klasse in Einschränkungen verwenden, bedeutet dies, dass Sie nur den Referenztyp verwenden können. Eine weitere Sache, die Sie hinzufügen müssen, ist, wann Sie die Einschränkung new () verwenden müssen. Dies muss das letzte sein, was Sie in die Constraints-Begriffe schreiben.
quelle