.NET Framework泛型

✍ dations ◷ 2025-12-10 20:32:41 #.NET Framework泛型

.NET Framework泛型是在.NET Framework 2.0的公共语言运行库(CLR)中的增加的一项新功能,类似于C++的模板,但不如C++的模板灵活,不过也有一些自己的特性。

泛型为.NET Framework引入了类型参数的概念,这样便可以设计出这样的类和方法:它们把指定类型的工作推迟到客户端代码声明并实例化类或方法的时候执行。比如,通过泛型类型参数T,程序员就可以编写其他客户端代码能够使用的单个类,而不用担心强制转换或装箱操作而带来的额外的运行成本或风险。

泛型类和方法较之非泛型类和方法具有更高的可用性、类型安全和效率,且通常用在集合和集合上运行的方法中。在.NET Framework2.0的类库中添加了一个新的命名空间System.Collections.Generic,其中含有一些新的基于泛型的集合类。微软建议程序员在设计面向.NET Framework 2.0的应用程序时不要使用旧的非泛型集合类(像ArrayList集合类),而去使用新的泛型集合类。

当然,程序员也可以创建自己的泛型类和方法,提供自己需要的解决方案,但微软不推荐自己创建泛型类,而建议使用.NET Framework类库中提供的List<T>类。

可以通过泛型类型参数传递一个类型(如一个类TestClass<T>)中的T是泛型的类型参数,可以通过它传递一个类型(如int),那么,在这个类中所有用类型参数(在本例中是T)定义的字段或方法等的类型都会根据传递进来的类型(本例中为int类型)所改变。

在定义泛型类或方法中,类型参数是客户端程序实例化泛型类变量时指定的类型占位符。泛型类不能像通常的类那样使用,因为它实际上并不是一个类型,可能更像一个类型的蓝图。要使用泛型类,客户端代码必须要指定尖括号中的类型参数并实例化类型才能构造类型。指定的类型参数可以是编译器可以识别的任何类型,并且可以构造任意数目的使用不同类型参数的实例。

通常,微软推荐采用如下命名规则:

对于泛型参数的约束是指对客户端代码实例化类时指定的类型参数进行限制,这样如果客户端的程序参试使用某个不允许使用的类型实例化类时会产生编译时错误。

以C# 为例,约束采用where上下文关键字指定。

若要对泛型列表中的项与其他某个项进行比较,便需要在一定程度上保证所调用的运算符或方法可以得到指定的类型参数的支持。这个保证正是建立在对泛型类定义的一个或多个约束获得的。一旦编译器得到了这样的保证,它就能够允许在泛型类中调用一些无约束的泛型中不允许使用的方法。

没有进行约束的泛型类型参数称为未绑定的类型参数。

当使用未绑定的类型参数时,相对于使用了约束的类型参数,有以下规则:

泛型类可以拥有至少一个泛型类型参数,泛型类型参数可以代替泛型类的字段、属性、方法的参数和返回值、事件的参数和返回值、构造函数的参数的类型,也可作为内部类和基类以及实现接口的泛型类型参数。

泛型类必须在创建其实例时明确指定其所有泛型类型参数的类型。泛型类的构造函数不能自动推断其泛型类型的泛型类型参数。

如果从泛型类派生,可以选择确定的泛型类型参数,也可以用泛型派生类,利用泛型派生类的泛型类型参数确定基类的泛型类型参数。

泛型接口的使用大体上与泛型类相同,只是接口不允许包含字段和构造函数,也不允许创建实例。实现接口时,同样也可以选择实现确定的泛型类型接口,或者利用泛型类型参数确定接口的泛型类型参数。

泛型方法可以拥有至少一个泛型类型参数,泛型类型参数可以作为方法的参数或返回值的类型。泛型方法不用明确指定各泛型类型参数,可由上下文自动推断,如果上下文无法自动推断,则必须明确指定。

泛型委托的使用大体上与泛型方法相同,泛型委托的泛型类型参数可以在创建时通过上下文自动推断。泛型委托实例总是具有确定的泛型类型参数。

泛型和模板都是用于提供类型参数支持的语言功能,但这两者有着诸多差异。

从语法层面上来说,一般认为泛型是一种相对模板简单的方法,而不具有模板的复杂性。但同时,泛型也不能提供模板的完整功能。

另一方面,从实现层面,泛型的替换是在运行时执行的,这样可以为实例化的对象保留泛型类型的信息。

下面列出了.NET Framework泛型和C++模板之间的主要区别:

泛型类型参数自身不能是泛型,但C++确实允许模板参数。

C++允许程序员编写可能对模板中某些类型参数无效的代码,然后将检查该代码中是否有用作类型参数的特定类型。比如说可以在C++中编写对类型参数对象的算术运算符的函数,这样在用不支持这些运算符的类型实例化模板时出现出现错误;而泛型是不允许这样的,它则要求相应地编写类当中的代码,使他们能够满足任何约束的类型。因此唯一允许的语言构造是那些能够从约束中推导出来的结构。

相关

  • 牛奶过敏牛奶过敏(英语:milk allergy)指免疫系统对于牛奶中的蛋白质产生过敏反应,主要症状是胃肠道、皮肤和呼吸的过敏反应。牛奶过敏属于食物过敏,但乳糖不耐症是缺乏需要消化牛奶中的乳
  • 生活在海洋中海洋真菌(marine fungi),或海生真菌,是生活在海洋或潮间带中的真菌。海洋真菌并不是一个分类单元,而是泛指分属于不同分类群,但生长环境均位于海洋或潮间带的多种真菌。绝对海生真
  • 溶剂化溶剂化,有时也称为溶解,为一吸引带有分子离子溶剂的溶液聚集的过程。当离子在溶剂中溶解,且会被溶剂分子所包围。由国际纯粹与应用化学联合会 (IUPAC)定义,溶剂化是指溶质和溶剂
  • SAS统计分析系统(英文:Statistical Analysis System),由北卡罗来纳州立大学两位生物统计学研究生所编写及制定,最早只是一个数学统计软件,于1976年由Jim Goodnight及John Sall博士等
  • 高山气候高地气候(highland climate)或称高山气候(Mountain climate)是粗糙的地理学术语,用来指称在高山的气候,或是更广泛的说,指高原地区的气候。它通常拿来与低地气候作对比,后者指称的是
  • 树状图树状结构(英语:Tree structure),又译树形结构,或称树状图(tree diagram)是一种将层次结构式的构造性质,以图象方式表现出来的方法。它的名称来自于以树的象征来表现出构造之间的关系
  • 异长穗小檗异长穗小檗(学名:)为小檗科小檗属的植物,为中国的特有植物。分布在中国大陆的甘肃、湖北、四川、青海、陕西等地,生长于海拔800米至3,000米的地区,多生于山地沟边、路边灌丛中及林
  • 和装本和装本(わそうぼん)是指以日本传统方法印刷、制作和装帧的书籍,相对于洋装本和唐本(中国古籍),也被称为和本。它大约是于奈良时代末期由日本僧侣从大唐引入,当时的印刷技术主要用于
  • Crime Scene 犯罪现场 (第三季)《Crime Scene 犯罪现场 (第三季)》(韩语:크라임씬3)是韩国JTBC电视台推出的推理型综艺节目,自称为国内首个RPG推理游戏,以神秘杀人事件为背景。参与者既要摆脱凶手嫌疑,又要一起
  • 林肯港林肯港(Port Lincoln, Galinyala)是澳洲南部一著名渔港,位置在澳大利亚西南端埃尔半岛的“波士顿海湾”,邮递区号5606。它也是南澳洲省西海岸最大城市,与阿得雷德的直线距离为280