В C#, Что такое <T> После Объявления метода?

Я - парень VB.Net. (потому что я должен быть, потому что человек, который подписывает мою проверку, говорит так. :P) я рос в Java, и я обычно не изо всех сил пытаюсь читать или записать в C#, когда я получаю шанс. Я столкнулся с некоторым синтаксисом сегодня, что я никогда не видел, и что я, может казаться, не выясняю.

В следующем объявлении метода, что представляет?

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

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

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

27
задан Drew 30 April 2010 в 15:52
поделиться

4 ответа

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

Метод sig должен быть таким:

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

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

Foo<MyClass>(myClassInstance, myClassInstance2, mySubclassInstance);
23
ответ дан 28 November 2019 в 05:01
поделиться

вы спрашиваете о концепции дженериков в 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 #, если у вас есть тип, допускающий значение NULL, или ссылочный тип, или вам нужно написать логику для преобразования значения к основному типу.

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

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

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

проверьте это, чтобы узнать больше: http://www.codeproject.com/kb/books/EssentialCS20.aspx

29
ответ дан 28 November 2019 в 05:01
поделиться

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

После того, как вы укажете тип для 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[]
1
ответ дан 28 November 2019 в 05:01
поделиться

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

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

Более подробную информацию о generics можно найти на MSDN: Introduction to Generics (C#).

1
ответ дан 28 November 2019 в 05:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: