我刚接触C#,直接开始为我收到的一个项目修改一些代码.但是,我一直看到这样的代码:

class SampleCollection<T>

我无法理解

<T> 

意思也不是它叫什么.

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

推荐答案

这是一张Generic Type Parameter美元的票.

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

创建可以保存字符串的集合.上面所示的Reverse方法的形式稍有不同,可以用来反转集合的成员.

.net相关问答推荐

信号量的多线程问题

out 和 ref 可以用作临时变量吗?

docs.microsoft.com 上的 .NET 平台扩展是什么?

如何为构造函数自定义 Visual Studio 的私有字段生成快捷方式?

为什么发布和调试模式下的代码行为不同?

.NET Core 是否支持异步控制台应用程序?

微软内部 PriorityQueue 中的错误?

无法加载文件或程序集'System.ComponentModel.Annotations,版本 = 4.1.0.0

使用带有大数据的 SqlCommand 异步方法的可怕性能

在 web api 控制器(.net 核心)中使用 async/await 或任务

在 .NET Core 中在 MVC 之外使用 Razor

如果 async-await 不创建任何额外的线程,那么它如何使应用程序响应?

无法在 Windows 10 上安装 Windows SDK 7.1

这在技术上是“Hello World”的 O(1) 算法吗?

如何使我的托管 NuGet 包支持 C++/CLI 项目?

多行 C# 插值字符串文字

如何下载没有 nuget.exe 或 Visual Studio 扩展的 Nuget 包?

/langversion 的错误选项“6”无效;必须是 ISO-1、ISO-2、3、4、5 或默认值

将枚举转换为字符串

添加对 MEF 插件项目的引用时,为什么会出现警告图标?