Czy możesz mi wyjaśnić, co where T : class, new()
oznacza poniższy wiersz kodu?
void Add<T>(T item) where T : class, new();
c#
generics
type-constraints
Rawhi
źródło
źródło
Odpowiedzi:
Jest to ograniczenie parametru ogólnego
T
. Musi byćclass
(typem referencyjnym) i musi mieć publiczny konstruktor domyślny bez parametrów.To znaczy
T
nie może byćint
,float
,double
,DateTime
lub dowolny innystruct
(typ wartości).Może to być
string
dowolny niestandardowy typ odwołania, o ile ma on domyślny lub parametryczny konstruktor.źródło
new()
precyzyjnie określa „musi mieć publiczny konstruktor bez parametrów”Są to ogólne ograniczenia typu. W twoim przypadku są dwa:
Oznacza, że typ
T
musi być typem odniesienia (a nie typem wartości).Oznacza, że typ
T
musi mieć konstruktor bez parametrów. Posiadanie tego ograniczenia pozwoli ci zrobić coś takiego jakT field = new T();
w kodzie, czego inaczej nie będziesz w stanie zrobić.Następnie połącz je za pomocą przecinka, aby uzyskać:
źródło
gdzie T: struct
Argument typu musi być typem wartości. Można określić dowolny typ wartości oprócz Nullable. Aby uzyskać więcej informacji, zobacz Korzystanie z typów dopuszczających wartości zerowe (Podręcznik programowania w języku C #).
gdzie T: klasa
Argument typu musi być typem referencyjnym, w tym dowolną klasą, interfejsem, delegatem lub tablicą. (Patrz przypis poniżej.)
gdzie T: new () Argument typu musi mieć publiczny konstruktor bez parametrów. W przypadku użycia w połączeniu z innymi ograniczeniami nowe () ograniczenie musi zostać określone na końcu.
gdzie T: [nazwa klasy podstawowej]
Argument typu musi pochodzić lub pochodzić z określonej klasy bazowej.
gdzie T: [nazwa interfejsu]
Argumentem typu musi być lub implementować określony interfejs. Można określić wiele ograniczeń interfejsu. Interfejs ograniczający może być również ogólny.
gdzie T: U
Argument typu dostarczony dla T musi pochodzić lub pochodzić z argumentu dostarczonego dla U. Nazywa się to ograniczeniem typu „goły”.
źródło
class
&new
są 2 ograniczenia ogólnego parametru parametruT
.Odpowiednio zapewniają one:
class
new
Ich kombinacja oznacza, że typ
T
musi być typem odniesienia (nie może być typem wartości ) i musi mieć konstruktor bez parametrów.Przykład:
źródło
new (): Określenie ograniczenia new () oznacza, że typ T musi używać konstruktora bez parametrów, aby obiekt mógł być z niego utworzony - patrz Konstruktory domyślne .
klasa: Oznacza, że T musi być typem referencyjnym, więc nie może być liczbą całkowitą, zmiennoprzecinkową, podwójną, DateTime ani inną strukturą (typem wartości).
źródło
Oznacza to, że typ
T
musi być klasą i mieć konstruktor, który nie przyjmuje żadnych argumentów.Na przykład musisz być w stanie to zrobić:
źródło
gdzie (C # Odniesienie)
Tak powinno być,
T
musi być klasą i mieć dostępny bez parametrów - lub domyślny konstruktor.źródło
To, co następuje po „Where”, jest ograniczeniem zadeklarowanego przez ciebie typu ogólnego T, więc:
klasa oznacza, że T powinna być klasą, a nie typem wartości lub strukturą.
new () wskazuje, że klasa T powinna mieć zdefiniowany konstruktor domyślny wolny od parametrów publicznych.
źródło
Nazywa się to „ograniczeniem” parametru ogólnego T. Oznacza to, że T musi być typem referencyjnym (klasą) i musi mieć publiczny domyślny konstruktor.
źródło
Jest to część mechanizmu Generics, w którym słowo kluczowe dodaje ograniczenia do tego, jakie typy muszą zostać zaimplementowane, aby mogły zostać użyte jako parametry typu.
źródło
kiedy używasz klasy w ograniczeniach, oznacza to, że możesz używać tylko typu Referencyjnego, kolejną rzeczą do dodania jest to, kiedy używasz ograniczenia new () , musi to być ostatnia rzecz, którą piszesz w warunkach Ograniczeń.
źródło