2.C#2.0之泛型

  2.1泛型类型声明

     泛型类声明是一种类声明,只不过它比类多声明类型参数列表和类型参数约束语句。

     只有提供类型参数列表,这个类声明才能提供类型参数化约束语句;提供了类型参数列表的类声明就是一个泛型类声明,此外任何嵌入到泛型类声明/泛型结构声明中的类,自身也是一个泛型类声明,因为它们必须提供包含类型的类型参数以创建构造类型。

     构造类型可以是一个/多个参数,例如List<T>,被称为开放构造类型;也可不使用类型参数来构造类型,例如List<int>,被称为封闭构造类型。

     构造类型不可被重载,也就是说,和普通类型一样,在一个作用域,泛型类型必须被唯一地命名;但在非限定类型名字查找中使用的类型查找规则和成员访问,确实考虑到了类型参数的个数。

   2.1.1 类型参数

     类型参数在类声明上提供,每个类型参数都是一个简单的标识符,它指定用来创建一个构造类型的类型参数的占位符,即为后面将要被提供的类型的占位符,被提供的类型才是实际的类型,即类型实参。

     类声明中的每个类型参数在类的声明空间定义了一个名字,这个名字不能和另一个类型参数/类中成员具有相同的名字,更不能和类型自身有相同的名字;类型参数的作用域包括基类、类型参数约束语句、类体;与类成员不同的是,它不能扩展到派生类。

     由于类型参数可以被许多不同的实际类型参数所实例化,所以类型参数与其他类型相比,略微有些不同的操作和限制:

        *.类型参数不能用于直接声明一个基类型或接口;

        *.对于在类型参数上的成员查找规则,如果约束存在,则依赖于应用到该类型参数的约束;

        *.有效的类型参数转换依赖于应用到该类型参数上的约束(如果有的话);

        *.文本null不能被转换到由类型参数所给定的类型,除非类型参数是由一个类约束所约束的,但可以使用一个默认值表达式代替;

        *.由一个类型参数给定的类型的值可以使用"=="和"!="于null进行比较;

        *.如果类型参数通过一个构造函数约束被约束,则new表达式只能为类型参数所使用;

        *.类型参数不能用于特性内的任何地方;

        *.类型参数不能用于成员访问,也不能标识号一个静态成员或嵌套类型的类型名字;

        *.在不安全代码中,类型参数不能用做非托管类型。

     作为一种类型,类型参数纯粹只是一个编译时构件;在运行时,每个类型参数被绑定到运行时类型,这是通过泛型类型声明所提供的类型实参而指定的;为此,在运行时,使用类型参数声明的变量类型是一个封闭类型。

   2.1.2 实例类型

     每个类声明都有与之关联的构造类型,即实例类型;对于一个泛型类声明,实例类型是通过创建一个来自于类型声明的构造类型而形成的;由于实例类型使用类型参数,因此只有在类型参数的作用域内,实例类型才有效。实例类型在类声明中是this的类型;对于非泛型类,实例类型就是声明类型。

   2.1.3 基类规范

     在类声明中指定的基类/基接口可以是一个构造类型/构造接口类型,但基类/基接口自身不能是类型参数,但在其作用域可以包含类型参数。

     泛型类声明不能使用System.Attribute作为直接或间接基类。

     在一个类中的方法如果重写或实现了基类或接口的方法,那么它必须为特定类型提供合适的方法:

   2.1.4 泛型类的成员

     泛型类的所有成员都可以使用封闭类中的类型参数,不论是直接使用还是作为构造类型的一部分。运行时实际类型参数会将其代替。

     在实例函数成员之内,this的类型就是声明的实例类型。

     除了使用类型参数作为类型之外,在泛型类声明中的成员也遵循和非泛型类成员相同的规则。其他的后面会写到~

   2.1.5 泛型类中的静态字段

     在一个泛型类声明中的静态变量,在相同封闭构造类型的所有实例中是被共享的,但在不同封闭构造类型的实例中,不被共享。有点绕口,举个栗子:

   2.1.6 泛型类中的静态构造函数

     泛型类中的静态构造函数用于初始化静态字段,为每个从特定泛型类声明中创建的不同的封闭构造类型,执行其他初始化。泛型类型声明的类型参数在作用域之内,可以在静态构造函数体内被使用。

     当发生下面情况,则会有一个新的封闭构造函数类类型被首次初始化:

             *.一个封闭构造类型的实例被创建;

             *.封闭构造类型的任何静态成员被引用。

     为了初始化一个新的封闭构造类类型,首先那个特定封闭类型的一组新静态字段将会被创建,每个静态字段都会被初始化为其的默认值;接着,将为这些静态字段执行静态字段初始化器。最后将执行静态构造函数。

     由于静态构造函数将为每个封闭构造类类型执行一次,所以对于无法在编译时通过约束进行的检查来说,在运行时去实施运行时检查将会很方便。

     这是使用静态构造函数检查一个类型参数是否是一个引用类型。

   2.1.7 访问受保护的成员

     在一个泛型类声明中,通过从泛型类构造的任何类型的实例,都可以对继承的受保护实例成员进行访问;尤其是访问被指定了protected和protected internal的实例成员的规则,进行了扩充:在一个泛型类G中,对于一个继承的受保护的实例成员M,可以使用E.M形式的基本表达式对一个继承的受保护实例成员进行访问,前提E的类型是从G构造的类类型,或是一个继承于从G构造的类类型的类类型。

   2.1.8 在泛型类中重载

     发

原文地址:https://www.cnblogs.com/dreamoffire/p/10173840.html

时间: 2024-10-12 00:24:39

2.C#2.0之泛型的相关文章

通用财经数据传输与监控平台1.0(泛型,接口与基类,Sql,Ibatis,Awt,Swing)

导言 本系统通过访问url接口,实现财经数据的获取以及实时的更新到用户本地数据库的功能,并且配备了实时的数据传输的监控平台.通过本系统,用户可以的得到并保存所需的财经数据(超过200张表),并能实时的查看数据传输是否正常以及传输中的过程. 目录结构 一.相关技术总结 1.通用DAO.Service.Action的设计与实现:(VERY IMPORTMANT) 面向对象设计:接口.基类.继承:泛型 (如通用类BaseObject.接口BaseDao与实现类BaseDaoImp的设计) 2.树Tre

原来Go2.0的泛型是这样的...

func main() { var jobs = Chan<Int>(buffer: 5) var done = Chan<Bool>() go { for ;; { var (j, more) = <?jobs if more { println("received job \(j!)") } else { println("received all jobs") done <- true return } } } for va

JavaWeb-21 JDBC(泛型,注解,Servlet3.0,Log4j)

JavaWeb-21 泛型,注解,Servlet3.0,Log4j 今天任务: 1.泛型概述 2.Dao模式下泛型的引入 3.注解及反射注解 4.Servlet3.0 5.Log4j(明白怎么用,就够) 一.了解泛型 1.了解泛型: GenericTestDemo1.java package com.itheima.generic; /** * 泛型类中的所有实例方法都可以不用声明,不包含静态方法 * @author wangli * * @param <T> */ public class

【转载】.NET面试题系列[0] - 写在前面

原文:.NET面试题系列[0] - 写在前面 索引: .NET框架基础知识[1] - .NET框架基础知识(1) http://www.cnblogs.com/haoyifei/p/5643689.html .NET框架基础知识[2] - .NET框架基础知识(2) http://www.cnblogs.com/haoyifei/p/5646288.html .NET框架基础知识[3] - C# 基础知识(1) - http://www.cnblogs.com/haoyifei/p/565054

第二十一章 泛型(generic)

(1)引言 泛型:是指参数化类型的能力. 例如:有这样一个类:这是一个比较简单并且是很常用的带有泛型的方法. package com.lidd.generic; public class GenericTestSecond { public <T>void one(T t){ } } 下面是几个类,分别是一般类.抽象类.接口(接口也是特殊的类). package com.lidd.generic; public class A { } package com.lidd.generic; pub

Java核心 --- 泛型

CoreJava 泛型 java泛型的出现避免了强制类型转换,便于代码更好的被阅读 本文的写作参照了张孝祥的泛型介绍:http://www.itcast.cn/news/dbfd20f1/f4b1/412d/9b40/c1a81b8bf1da.shtml 更多疑问请参考:http://www.vaikan.com/java-generics-quick-tutorial/ 1.可以接收类型参数的类型在接受类型参数后变为泛型,但是,虽然是不同的泛型但是还是相同的类型 package com.yuk

Java编程思想学习(十一) 泛型

1.概要 generics enable types (classes and interfaces) to be parameters when defining classes, interfaces and methods. 泛型能在定义类,接口和方法时将类型(类和接口)作为参数.和方法声明时的形式参数很类似,都是为了在不同的输入时重用相同的代码.不同的是形式参数输入的是值而泛型是类型. 2.为什么使用泛型 1.编译时更加强的(Stronger)类型检测java编译器对泛型代码进行强类型检

Java泛型通配符学习 —— Java Generic&#39;s Wildcards

Java Generic's wildcards is a mechanism in Java Generics aimed at making it possible to cast a collection of a certain class, e.g A, to a collection of a subclass or superclass of A. This text explains how. 理解:Java的泛型通配符机制旨在实现集合的类型转换.例如集合A,转换为A的子类集合或

泛型初探

泛型初探 在泛型(Generic type或Generics)出现之前,是这么写代码的: public static void main(String[] args) { List list = new ArrayList(); list.add("123"); list.add("456"); System.out.println((String)list.get(0)); } 当然这是完全允许的,因为List里面的内容是Object类型的,自然任何对象类型都可以