我是VB.Net的人。 (因为我必须这样做,因为签署我的支票的人是这样说的。:P)我是在Java中长大的,当我有机会时,我通常不会在C#中阅读或写作。我今天遇到了一些我从未见过的语法,而且我似乎无法弄明白。
在以下方法声明中,< T>代表什么?
static void Foo< T>(params T [] x)
我已经看到与声明泛型集合和事物一起使用,但我不能为我的生活弄清楚它对这种方法的作用。
如果重要,我在考虑一些C# brain teasers时遇到过它。第六个预告片包含整个代码段。
答案 0 :(得分:28)
你要问的是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
答案 1 :(得分:23)
这定义了一个generic method,它是generics的一种形式,在C#2.0中被添加到C#中。
方法sig应为:
static void Foo<T>(params T[] x)
{ // ...
这允许您将任意(特定)类型的任意数量的参数传递给方法Foo,并且它作用于该参数数组。它与泛型类型的工作方式类似,只是作用于方法。 <T>
指定传递给方法的参数的类型,因此您可以将其称为:
Foo<MyClass>(myClassInstance, myClassInstance2, mySubclassInstance);
答案 2 :(得分:1)
这是Generic Method的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[]
答案 3 :(得分:1)
T是type parameter,在这种情况下可以是任何东西(可以指定约束,但这里没有约束)。如果没有此功能,您必须为计划使用的每种类型声明方法:
static void Foo(params int[] x)
static void Foo(params string[] x)
static void Foo(params Customer[] x)
etc...
有关泛型的更多信息,请访问MSDN:Introduction to Generics (C#)。