泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。泛型集合类可以将类型形参用作其存储的对象类型的占位符;类型形参呈现为其字段的类型和其方法的参数类型。泛型方法可将其类型形参用作其返回值的类型或用作其形参之一的类型。
不太懂?那么来个通俗易懂的。
泛型在 .NET Framework 2.0 中首次引入,它本质上是一个“代码模板”,可让开发人员定义类型安全数据结构,无需处理实际数据类型。
为方便理解泛型的作用,让我们对比一下非泛型集合类:ArrayList。 在 .NET Framework 1.0 中,ArrayList
元素属于 Object 类型。 这意味着添加的任何元素都会以静默方式转换为 Object
。 从列表读取元素时,会发生相同的情况。 此过程称为装箱和拆箱,它会影响性能。 但更重要的是,在编译时无法确定列表中的数据类型。 这就使得某些代码不太可靠。 泛型解决了此问题,它可以定义每个列表实例将要包含的数据类型。 例如,只能将整数添加到 List<int>
,只能将人员添加到 List<Person>
。
泛型还可以在运行时使用。 这意味着,运行时知道你要使用的数据结构类型,并可以更高效地将数据结构存储在内存中。
List<int>
的类型是 Int32,因此可以将列表元素存储在内存中的基础整数数组内,而非泛型 ArrayList
必须将每个列表元素强制转换为对象,多余的强制转换会占用时间,降低列表排序的速度。https://docs.microsoft.com/zh-cn/dotnet/standard/generics