Co oznacza w C# [duplicate]
To pytanie ma już odpowiedź tutaj:
- co oznacza "T" w C#? 7 odpowiedzi
Jestem nowy w C# i bezpośrednio nurkuję do modyfikowania kodu do projektu, który otrzymałem. Jednak ciągle widzę taki kod:
class SampleCollection<T>
I nie mogę zrozumieć, co
<T>
Oznacza ani to, jak się nazywa.
Gdyby ktoś chciał pomóż mi tylko nazwać to, co nazywa się ta koncepcja, mogę ją wyszukać w Internecie. Jednak od teraz nie mam pojęcia.
3 answers
Jest to parametr typu ogólnego .
Parametr typu ogólnego pozwala określić dowolny typ T metody podczas kompilacji, bez podawania konkretnego typu w deklaracji metody lub klasy.
Na przykład:
public T[] Reverse<T>(T[] array)
{
var result = new T[array.Length];
int j=0;
for(int i=array.Length; i>= 0; i--)
{
result[j] = array[i];
j++;
}
return result;
}
Odwraca elementy w tablicy. Kluczowym punktem jest to, że elementy tablicy mogą być dowolnego typu, a funkcja nadal będzie działać. Typ można określić w wywołaniu metody; bezpieczeństwo typu jest nadal gwarantowane.
Więc, aby odwrócić tablicę ciągów:
string[] array = new string[] { "1", "2", "3", "4", "5" };
var result = reverse(array);
Wytworzy tablicę łańcuchów w result
z { "5", "4", "3", "2", "1" }
Ma to taki sam efekt, jak gdyby wywołano zwykłą (nie-generyczną) metodę, która wygląda tak:
public string[] Reverse(string[] array)
{
var result = new string[array.Length];
int j=0;
for(int i=array.Length; i >= 0; i--)
{
result[j] = array[i];
j++;
}
return result;
}
Kompilator widzi, że array
zawiera ciągi znaków, więc zwraca tablicę łańcuchów. Typ string
zastępuje się parametrem typu T
.
Parametry typu ogólnego mogą być również używane do tworzenia klas generycznych. W przykładzie ty dano z SampleCollection<T>
, T
jest symbolem zastępczym dla dowolnego typu; oznacza to, że {[11] } może reprezentować kolekcję obiektów, których Typ określasz podczas tworzenia kolekcji.
Więc:
var collection = new SampleCollection<string>();
Tworzy kolekcję, która może zawierać ciągi znaków. Metoda Reverse
przedstawiona powyżej, w nieco innej formie, może być użyta do odwrócenia członów zbioru.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-09 22:45:07
Jest to parametr typu ogólnego, Zobacz Generics dokumentacja .
T
nie jest zarezerwowanym słowem kluczowym. T
, lub dowolne imię, oznacza parametr typu. Sprawdź poniższą metodę (tylko jako prosty przykład).
T GetDefault<T>()
{
return default(T);
}
Zauważ, że typem zwracanym jest T
. Za pomocą tej metody można uzyskać wartość domyślną dowolnego typu wywołując metodę jako:
GetDefault<int>(); // 0
GetDefault<string>(); // null
GetDefault<DateTime>(); // 01/01/0001 00:00:00
GetDefault<TimeSpan>(); // 00:00:00
. NET używa generyków w kolekcjach, ... przykład:
List<int> integerList = new List<int>();
W ten sposób będziesz miał listę, która akceptuje tylko liczby całkowite, ponieważ klasa jest instancyjna z typem T
, w tym przypadku int
, A metoda dodająca Elementy jest zapisana jako:
public class List<T> : ...
{
public void Add(T item);
}
Trochę więcej informacji o generykach.
Możesz ograniczyć zakres Typu T
.
Poniższy przykład pozwala tylko na wywołanie metody z typami, które są klasami:
void Foo<T>(T item) where T: class
{
}
Poniższy przykład pozwala tylko na wywołaj metodę z typami, które są Circle
lub dziedziczą z niej.
void Foo<T>(T item) where T: Circle
{
}
I jest new()
, który mówi, że możesz utworzyć instancję T
, jeśli ma ona konstruktor bez parametru. W poniższym przykładzie T
będzie traktowane jako Circle
, otrzymasz intellisense...
void Foo<T>(T item) where T: Circle, new()
{
T newCircle = new T();
}
Ponieważ T
jest parametrem typu, można z niego pobrać obiekt Type
. Z Type
możesz użyć reflection...
void Foo<T>(T item) where T: class
{
Type type = typeof(T);
}
Jako bardziej złożony przykład sprawdź podpis ToDictionary
lub dowolny inna metoda Linq.
public static Dictionary<TKey, TSource> ToDictionary<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector);
Nie ma T
, ale jest TKey
i TSource
. Zaleca się, aby zawsze nazywać parametry typu prefiksem T
, Jak pokazano powyżej.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-11 18:34:16
Ta funkcja jest znana jako generyki. http://msdn.microsoft.com/en-us/library/512aeb7t (v=vs.100). aspx
Przykładem tego jest utworzenie zbioru przedmiotów określonego typu.
class MyArray<T>
{
T[] array = new T[10];
public T GetItem(int index)
{
return array[index];
}
}
W Twoim kodzie możesz zrobić coś takiego:
MyArray<int> = new MyArray<int>();
W tym przypadku, T[] array
będzie działać jak int[] array
, A public T GetItem
będzie działać jak public int GetItem
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-25 01:37:01