В С#, что такое <T> После объявления метода?
Я парень VB.Net. (потому что я должен быть, потому что человек, который подписывает мой чек, говорит так: P) Я вырос на Java, и я вообще не пытаюсь читать или писать на С#, когда у меня появляется такая возможность. Сегодня я наткнулся на какой-то синтаксис, которого я никогда не видел, и что я не могу понять.
В следующем объявлении метода, что делает <T> представляют?
static void Foo <T> (параметры T [] x)
Я видел, что он используется вместе с объявлением общих коллекций и вещей, но я не могу для жизни понять, что он делает для этого метода.
В случае, если это имеет значение, я натолкнулся на него, когда подумал о некоторых мозговых дразнях С#. Шестой тизер содержит весь фрагмент кода.
Ответы
Ответ 1
Это определяет общий метод, который является одной из форм generics, которые были добавлены в С# в С# 2.0.
Метод sig должен быть:
static void Foo<T>(params T[] x)
{ // ...
Это позволяет передавать любое количество аргументов любого (определенного) типа в метод Foo и действует на этот массив аргументов. Он похож на то, как работают общие типы, за исключением области только для метода. <T>
указывает тип передаваемого аргумента в метод, поэтому вы можете называть это следующим образом:
Foo<MyClass>(myClassInstance, myClassInstance2, mySubclassInstance);
Ответ 2
то, что вы просите, - это концепция дженериков в С#. Используя общие методы, вы можете использовать этот метод для типов, которые вы хотите
Предположим, вам нужно создать функцию для добавления двух чисел.
В этом случае ваша функция
//For integer :
public int sum(int a, int b)
{
return a + b;
}
//For floating point numbers :
public float sum( float a, float b)
{
return a + b;
}
Следуя этой логике, если вы хотите функцию, которая будет суммировать два двойных типа, вы должны создать еще одну функцию и т.д.
Bu с помощью дженериков вы можете заменить все эти функции и написать следующее,
public T sum<T>(T a, T b)
{
return a + b;
}
Это будет работать для всех числовых типов, а также для строк.
проверьте это для более подробной информации: http://www.codeproject.com/kb/books/EssentialCS20.aspx
Ответ 3
Это параметр Generic Type универсального метода.
Как только вы укажете тип для T при вызове метода,.NET может обеспечить безопасность типа на основе этого параметра.
static void Foo<T>(params T[] x) { }
будет вызываться как:
string[] names = new string[] {"Foo", "Bar", "Baz"};
Foo<string>(names);
но это вызовет ошибку компилятора:
int[] nums = new int[] {1, 2, 3};
Foo<string>(nums); // nums is not string[]
Ответ 4
T является параметром и в этом случае может быть любым (может быть указано ограничение, но здесь нет ограничения), Без этой функции вам придется объявить метод для каждого типа, который вы планируете использовать:
static void Foo(params int[] x)
static void Foo(params string[] x)
static void Foo(params Customer[] x)
etc...
Более подробную информацию о дженериках можно найти в MSDN: Введение в Generics (С#).