在 C # 中 < T > 表示什么

我是 C # 的新手,直接为我收到的一个项目修改了一些代码。然而,我一直看到这样的代码:

class SampleCollection<T>

我无法理解

<T>

也不知道它叫什么。

如果有人愿意帮我说出这个概念叫什么,我可以在网上搜索。但是,我现在一点头绪都没有。

204302 次浏览

这是 泛型类型参数

泛型类型参数允许您在编译时为方法指定任意类型 T,而无需在方法或类声明中指定具体类型。

例如:

public T[] Reverse<T>(T[] array)
{
var result = new T[array.Length];
int j=0;
for(int i=array.Length - 1; i>= 0; i--)
{
result[j] = array[i];
j++;
}
return result;
}

反转数组中的元素。这里的关键点是,数组元素可以是任何类型,函数仍然可以工作。您可以在方法调用中指定类型; 类型安全性仍然得到保证。

因此,要逆转字符串数组:

string[] array = new string[] { "1", "2", "3", "4", "5" };
var result = reverse(array);

将在 { "5", "4", "3", "2", "1" }result中生成一个字符串数组

这与调用普通(非泛型)方法的效果相同,如下所示:

public string[] Reverse(string[] array)
{
var result = new string[array.Length];
int j=0;
for(int i=array.Length - 1; i >= 0; i--)
{
result[j] = array[i];
j++;
}
return result;
}

编译器看到 array包含字符串,因此它返回一个字符串数组。类型 string被取代为 T类型参数。


泛型类型参数也可用于创建泛型类。在您给出的 SampleCollection<T>示例中,T是任意类型的占位符; 这意味着 SampleCollection可以表示一个对象集合,该对象集合的类型是您在创建该集合时指定的。

所以:

var collection = new SampleCollection<string>();

creates a collection that can hold strings. The Reverse method illustrated above, in a somewhat different form, can be used to reverse the collection's members.

这个特性称为泛型

这方面的一个示例是创建特定类型的项的集合。

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一样工作。

它是一个泛型类型参数 见 < em > Generics 文档

T is not a reserved keyword. T, 或任何给定名称, means a type parameter. Check the following method (just as a simple example).

T GetDefault<T>()
{
return default(T);
}

注意,返回类型是 T。使用这个方法,您可以通过以下方式调用该方法来获得任何类型的默认值:

GetDefault<int>(); // 0
GetDefault<string>(); // null
GetDefault<DateTime>(); // 01/01/0001 00:00:00
GetDefault<TimeSpan>(); // 00:00:00

.NET 在集合中使用泛型,... 示例:

List<int> integerList = new List<int>();

这样,您将拥有一个只接受整数的列表,因为类是用 T类型(在本例中为 int)实例化的,并且添加元素的方法写为:

public class List<T> : ...
{
public void Add(T item);
}

Some more information about generics.

您可以限制 T类型的范围。

下面的示例只允许您使用类的类型调用该方法:

void Foo<T>(T item) where T: class
{
}

下面的示例只允许您使用 Circle类型或从中继承的类型调用该方法。

void Foo<T>(T item) where T: Circle
{
}

new()表示,如果 T有一个无参数的构造函数,那么就可以创建它的一个实例。在下面的示例中,T将被视为 Circle,您将获得智能感知..。

void Foo<T>(T item) where T: Circle, new()
{
T newCircle = new T();
}

由于 T是一个类型参数,因此可以从中获取对象 Type。使用 Type你可以使用反射..。

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。建议始终使用前缀 T命名类型参数,如上所示。

如果你愿意,你可以命名为 TSomethingFoo