'为什么'和'哪里'实际使用泛型?

NLV*_*NLV 8 .net c# generics

我知道泛型用于实现类型安全,我经常读到它们主要用于自定义集合.但为什么我们需要让它们通用?

例如,

为什么我不能用string[]而不是List<string>

让我们考虑我声明一个泛型类,它有一个泛型类型参数X.

T x;
Run Code Online (Sandbox Code Playgroud)

如果我提供了一个类的方法

x = x + 1;
Run Code Online (Sandbox Code Playgroud)

实际上是什么意思?我不知道T实际会发生什么,我不知道实际上会发生什么x = x + 1.

如果我无法在我的方法中进行自己的操作,那么泛型如何帮助我呢?

我已经学过很多书卷答案了.如果任何人能够在此提供一些明确的见解,将不胜感激.

此致,NLV

Eri*_*ert 17

你的问题回答了自己.数组类型本身就是一种通用类型.如果我们把一个通用型系统CLR V1.0,我愿意打赌,不会有什么特殊的数组类型,就只是Array<T>一起List<T>等.由于CLR的第一个版本没有泛型类型,因此我们将最重要和最明显的泛型类型(数组类型)放入其中.因此,在那里只有一大堆专用代码来处理数组,这是v1.0中支持的CLR的一种通用类型.

由于数组本质上是泛型类型,因此您的问题会自行解决:泛型类型的原因通常与激发数组类型模式创建的原因相同.即:数组类型以特定方式放大其基础类型的能力.

int表示数字.int []表示数字的集合; 我们已经放大数的概念,以数字集合的概念.客户代表客户.Customer []代表了一组客户的概念.我们将客户的概念扩展到了客户收集的概念.从类型T到类型T []的映射表示将类型的实例一般放大到该类型的实例集合的抽象概念.

同样的理由激励所有通用类型.该Nullable<T>类型将类型放大为"此事可能是该类型的实例"的概念.该IComparable<T>类型将类型放大为"此类型的实例可以相对于另一个实例进行排序"的概念.等等.每个泛型类型就像数组模式一样:它表示将类型放大为新类型,为该类型提供新操作.

简而言之:通用类型系统的目的是使您能够发明自己的类型放大,并使用类型系统操纵这些放大.


Ign*_*ams 9

当我们需要"高阶"多态时,我们使用泛型,类似于编译时鸭子类型.当我们说Foo<T>我们的意思是Foo<>取决于任何可能的某些属性T,并且给定T具有此属性,或者代码无法编译.

当我们说x = x + 1,我们暗示T能够1添加它,并且返回类型是T.