在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 { } 

以下示例仅允许您使用Circletypes或从中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 ,但是有TKeyTSource 。 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一样工作。