Co oznacza w C# [duplicate]

To pytanie ma już odpowiedź tutaj:

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.

Author: Robert Harvey, 2012-03-25

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.

 82
Author: Robert Harvey,
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.

Możesz nazwać, jeśli chcesz.
 15
Author: BrunoLM,
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.

 7
Author: Kendall Frey,
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