Я - парень VB.Net. (потому что я должен быть, потому что человек, который подписывает мою проверку, говорит так. :P) я рос в Java, и я обычно не изо всех сил пытаюсь читать или записать в C#, когда я получаю шанс. Я столкнулся с некоторым синтаксисом сегодня, что я никогда не видел, и что я, может казаться, не выясняю.
В следующем объявлении метода, что
статический пустой Foo
Я видел используемый в сочетании с объявлением универсальных наборов и вещей, но я не могу ни за что в жизни выяснить то, что оно делает для этого метода.
В случае, если это имеет значение, я столкнулся с ним при размышлении о некоторых мозговых тизерах C#. Шестой тизер содержит весь фрагмент кода.
Это определяет универсальный метод , который является одной из форм универсальных шаблонов , которые были добавлены в C # в C # 2.0.
Метод sig должен быть таким:
static void Foo<T>(params T[] x)
{ // ...
Это позволяет вам передавать любое количество аргументов любого (определенного) типа в метод Foo, и он воздействует на этот массив аргументов. Это похоже на то, как работают универсальные типы, за исключением того, что ограничивается только методом.
определяет тип аргумента, передаваемого в метод, поэтому вы можете вызвать это так:
Foo<MyClass>(myClassInstance, myClassInstance2, mySubclassInstance);
вы спрашиваете о концепции дженериков в 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
Это параметр универсального типа универсального метода.
После того, как вы укажете тип для 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[]
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#).