В C # что такое <T>после объявления метода? - PullRequest
27 голосов
/ 30 апреля 2010

Я парень из VB.Net. (потому что я должен быть, потому что человек, который подписывает мой чек, говорит так. Сегодня я натолкнулся на некоторый синтаксис, который никогда не видел, и который, похоже, не могу понять.

Что означает в следующем объявлении метода?

статическая пустота Foo (параметры T [] x)

Я видел, как используется вместе с объявлением общих коллекций и вещей, но я не могу до конца жизни понять, что это делает для этого метода.

В случае, если это имеет значение, я сталкивался с этим, когда думал о некоторых C # мозговых тизерах . Шестой тизер содержит весь фрагмент кода.

Ответы [ 4 ]

28 голосов
/ 30 апреля 2010

то, что вы спрашиваете, это концепция обобщений в c #. Используя дженерики, вы можете использовать этот метод для типов, которые вы хотите

Предположим, вам нужно создать функцию для добавления двух чисел. В этом случае ваша функция

//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;
}

Следуя этой логике, если вам нужна функция, которая будет суммировать два числа двойного типа, вы создадите еще одну функцию и т. Д.

Примечание: приведенный выше код не будет работать с C #, но он для простого объяснения концепции, он просто sudo-код, он будет работать с C #, если у вас легко обнуляемый тип или ссылочный тип или нужно написать логику преобразовать значение в основной тип.

Но с помощью обобщений вы можете заменить все эти функции и написать следующее:

public T sum<T>(T a, T b)
{
  return a + b;
}

Это будет работать для всех числовых типов, а также для строк.

проверьте это для более подробной информации: http://www.codeproject.com/kb/books/EssentialCS20.aspx

23 голосов
/ 30 апреля 2010

Это определяет универсальный метод , который является одной из форм универсальных , которые были добавлены в C # в C # 2.0.

Метод sig должен быть:

static void Foo<T>(params T[] x)
{ // ...

Это позволяет передавать любое количество аргументов любого (определенного) типа в метод Foo, и он действует на этот массив аргументов. Это похоже на работу универсальных типов, за исключением области действия только для метода. <T> указывает тип аргумента, передаваемого в метод, поэтому вы можете вызвать его следующим образом:

Foo<MyClass>(myClassInstance, myClassInstance2, mySubclassInstance);
1 голос
/ 30 апреля 2010

T является параметром типа , и в этом случае может быть любым (ограничение может быть указано, но здесь нет ограничения). Без этой функции вам пришлось бы объявлять метод для каждого типа, который вы планируете использовать:

static void Foo(params int[] x)    
static void Foo(params string[] x)    
static void Foo(params Customer[] x)    
etc...

Более подробную информацию о дженериках можно найти в MSDN: Введение в дженерики (C #) .

1 голос
/ 30 апреля 2010

Это параметр универсального типа универсального метода.

После указания типа для 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[]
...