在 C# 中表示什么

本文关键字:表示 什么 | 更新日期: 2023-09-27 18:29:05

我是C#的新手,直接潜入修改我收到的项目的一些代码。但是,我一直看到这样的代码:

class SampleCollection<T>

我无法理解

<T> 

意思也不是叫什么。

如果有人愿意帮我说出这个概念的名字,我可以在网上搜索。但是,到目前为止,我一无所知。

<T>在 C# 中表示什么

它是一个

泛型类型参数。

泛型类型参数允许您在编译时为方法指定任意类型 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);

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

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

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>();

创建可以保存字符串的集合。 上面所示的Reverse方法(形式略有不同(可用于反转集合的成员。

它是一个泛型类型参数,请参阅泛型文档。

T不是保留关键字。 T 或任何给定名称表示类型参数。检查以下方法(仅作为一个简单的示例(。

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);
}

有关泛型的更多信息。

您可以限制类型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的名字。

此功能称为泛型。 http://msdn.microsoft.com/en-us/library/512aeb7t(v=vs.100(.aspx

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

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