C# 泛型


一、泛型假设我要写个公用的输出传入参数的方法(不用泛型),因为万物皆对象的理由,我先定义一个方法show(object obj),如下面所示:执行这个方法如果传入的是值类型,值类型转换为引用类型,我们知道会发生装箱,这是对性能的损害,想想如果是个集合,就得多次执行装箱、拆箱操作。如ArrayList类,ArrayList储存对象,Add()方法定义为需要把一个对象作为参数,如果传入的值类型,就得装箱,在读取ArrayList中的值时,又得进行拆箱,如下面代码所示:如果使用泛型,就不会出现这样的问题了,我们使用List类来改造上面代码:这里就不存在装箱和拆箱了,所以我们在使用集合的时候,尽量使用泛型集合,不要使用非泛型集合。二、类型安全在上面ArrayLis免费云主机域名t类中,添加参数时,可以添加任何对象,比如上面的例子,如果在添加整数类型后再添加引用类型,这么做在编译时是没有任何问题,但是在foreach语句使用整数类型迭代的时候就会报错。这时候就会报InvalidCastException的异常。如果使用泛型集合List的时候去重写上面的代码,在编译的时候就会报错。所以这个地方我们就能知道,泛型是在编译时就已经执行了,所以系统运行时我们时没有装箱拆箱的系统开销,而非泛型是在运行时执行的,所以可能导致异常发生;三、创建泛型类和泛型方法泛型方法,从我最先第一个例子Show(object) ,采用泛型来重写,定义为Show(T);泛型类,如public class List{}3.1 命名约定 泛型类型的名称用字母T作为前缀。 如果没有特殊的要求,泛型类型运行用任意类替代,且只使有一个泛型类型,就可以用字符T作为泛型类型的名称。 如果泛型类型有特殊的要求(如它必须实现一个接口或派生自基类),或者使用了两个或以上的泛型类型,就应给泛型类型使用描述性的名称: public delegate void EventHandler(object sender,TEventArgs e); public delegate TOutput Convert(TInput input); public class SortedList{};3.2 默认值 在泛型类和泛型方法中产生的一个问题是,在预先未知以下情况时,如何将默认值分配给参数化类型 T,给定参数化类型 T 的一个变量 t,只有当 T 为引用类型时,语句 t = null 才有效;只有当 T 为数值类型而不是结构时,语句 t = 0 才能正常使用。解决方案是使用default关键字,此关键字对于引用类型会返回 null,对于数值类型会返回零。 对于结构,此关键字将返回初始化为零或 null 的每个结构成员。使用方式如:T obj=default(T);3.3 约束在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制。 如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误。 这些限制称为约束。 约束是使用where上下文关键字指定的。下表列出了六种类型的约束:上面代码,使用泛型类型添加了两个约束,声明指定类型T必须实现了IComparer接口,且必须有一个默认构造函数上面代码用了两个泛型类型,TOutput必须实现了IComparer接口,且必须有一个默认构造函数,TInput必须是引用类型,且类型必须是TOutput或派生自TOutput。3.4 继承泛型类型可以实现泛型接口,也可以派生自一个类。泛型类型可以派生自泛型基类,其要求必须重复接口的泛型类型,或者必须指定基类的类型。如下列所示:派生类可以是泛型类或非泛型类,例如定义一个抽象的泛型基类,它在派生类中用一个具体的类型实现,如下列所示:四、结语这些泛型类和泛型方法将一个或多个类型的指定推迟到客户端代码声明并实例化该类或方法的时候。例如,通过使用泛型类型参数 T,您可以编写其他客户端代码能够使用的单个类,而不致引入运行时强制转换或装箱操作的成本或风险。在架构中有句话是让一切能延迟的延迟。

相关推荐: linux中top命令显示不全怎么解决

这篇“linux中top命令显示不免费云主机域名全怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“linux中top命令显示不全怎么解决”…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 01/26 18:38
Next 01/26 18:39