在C#中,<T>代表什么?
我是C#的新手,直接修改我收到的项目的一些代码。 不过,我一直看到这样的代码:
class SampleCollection<T>
我无法理解什么
<T>
意味着什么也不叫它。
如果有人愿意帮我指出这个概念的名称,我可以在网上search。 但是,我现在还是无能为力。
它是一个通用types参数 。
genericstypes参数允许您在编译时为方法指定任意types的T,而不在方法或类声明中指定具体types。
例如:
public T[] Reverse<T>(T[] array) { var result = new T[array.Length]; int j=0; for(int i=array.Length; i>= 0; i--) { result[j] = array[i]; j++; } return result; }
颠倒数组中的元素。 这里的关键是数组元素可以是任何types,并且该函数仍然可以工作。 您在方法调用中指定types; 型式安全仍然有保证。
所以,要反转一个string数组:
string[] array = new string[] { "1", "2", "3", "4", "5" }; var result = reverse(array);
将会产生一个string数组, result
是{ "5", "4", "3", "2", "1" }
这和你调用普通(非generics)方法的效果相同,如下所示:
public string[] Reverse(string[] array) { var result = new string[array.Length]; int j=0; for(int i=array.Length; i >= 0; i--) { result[j] = array[i]; j++; } return result; }
编译器看到array
包含string,所以它返回一个string数组。 typesstring
被replace为T
型参数。
genericstypes参数也可以用来创buildgenerics类。 在你给SampleCollection<T>
的例子中, T
是一个任意types的占位符, 这意味着SampleCollection
可以表示一个对象的集合,这是您在创build集合时指定的对象的types。
所以:
var collection = new SampleCollection<string>();
创build一个可以保存string的集合。 上面所示的Reverse
方法,可以用一种不同的forms来反转该集合的成员。
这是一个genericstypes参数, 请参阅generics文档 。
T
不是保留关键字。 T
或任何给定的名称意味着一个types参数。 检查下面的方法(就像一个简单的例子)。
T GetDefault<T>() { return default(T); }
请注意,返回types是T
使用这种方法,您可以通过调用方法来获取任何types的默认值:
GetDefault<int>(); // 0 GetDefault<string>(); // null GetDefault<DateTime>(); // 01/01/0001 00:00:00 GetDefault<TimeSpan>(); // 00:00:00
.NET在集合中使用generics,例如:
List<int> integerList = new List<int>();
这样你将得到一个只接受整数的列表,因为这个类是用typesT
,在这种情况下是int
,而添加元素的方法写成:
public class List<T> : ... { public void Add(T item); }
有关generics的更多信息。
你可以限制typesT
的范围。
以下示例仅允许您使用类的types调用该方法:
void Foo<T>(T item) where T: class { }
以下示例仅允许您使用Circle
types或从中inheritance的方法调用该方法。
void Foo<T>(T item) where T: Circle { }
有new()
,说你可以创build一个T
的实例,如果它有一个无参数的构造函数。 在下面的例子中, T
将被视为Circle
,您将获得智能感知…
void Foo<T>(T item) where T: Circle, new() { T newCircle = new T(); }
由于T
是一个types参数,您可以从中获取对象Type
。 随着Type
你可以使用reflection…
void Foo<T>(T item) where T: class { Type type = typeof(T); }
作为一个更复杂的例子,检查ToDictionary
或任何其他Linq方法的签名。
public static Dictionary<TKey, TSource> ToDictionary<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector);
没有T
,但是有TKey
和TSource
。 build议您始终使用前缀T
命名types参数,如上所示。
你可以命名TSomethingFoo
如果你想。
这个function被称为generics。 http://msdn.microsoft.com/en-us/library/512aeb7t(v=vs.100).aspx
这样做的一个例子是做一个特定types的项目的集合。
class MyArray<T> { T[] array = new T[10]; public T GetItem(int index) { return array[index]; } }
在你的代码中,你可以做这样的事情:
MyArray<int> = new MyArray<int>();
在这种情况下, T[] array
将像int[] array
一样工作,而public T GetItem
将像public int GetItem
一样工作。