C#泛型如何提高性能的
C#里讲泛型可以减少装箱和拆箱,那泛型参数的原始类型是什么?java中的类型参数擦除后为Object,并且强制转换是编译器自动插入的。那为什么C#说能减少装箱和拆箱?难道...
C#里讲泛型可以减少装箱和拆箱,那泛型参数的原始类型是什么?java中的类型参数擦除后为Object,并且强制转换是编译器自动插入的。那为什么C#说能减少装箱和拆箱?难道说c#泛型模板实例化后产生一个不同的类型吗?
展开
5个回答
展开全部
在CLR1.0中,要创建一个灵活的类或方法,者握但该类或方法在编译首斗庆期间不知道使用什么类,就必须以Object类为基础。而Object类在编译期间没有类型安全性。因此必须进行强制类型转换。另外,给值类型使用Object类会有性能损失。
CLR2.0(.Net
3.5
基于CLR2.0)提供了泛型。有了泛型,就不需要Objcet类。
System.Collections.Generic命名空间中的List
<T>类不使用对象,而是在使用定义类型。
泛型优点1:性能。
值类型存储在堆栈上,引用类型储存在堆上。
C#类是引用类型,结构是值类型。.Net很容易把值类型转换为引用类型。所以可以在需要对象(对象是引用类型)的任意地方使用值类型。
例如:int可以赋予一个对象,从值类型转换为引用类型成为装箱,如果方法需要吧一个对象作为参数,而且传送了一个值类型。装箱操作就会自动进行。另一方面,装箱的值类型可以使用拆箱操作转换为值类型。在拆箱时,需要使用类型转换运算符。
装箱和拆箱操作性能损失比较大。遍历许多项时尤其如此。
System.Collections.Genriec名称空间中的List<T>类不使用对象,而是在使用时定义类型。当List<T>的泛型类型定义为int,int类型在JIT编译器动态生成的类中使用,不再进行装箱和拆箱操作
泛型优点2:类型安全
如果在ArrayList类中添加一个整数、一个字符串、一个MyClass类型的对象,如果这个集合使用Foreach语句迭代并转换为Int那么会出现异常。
在泛型类List<T>中,泛型类型T定义了允许使用的类型。有了List<int>的定义。就只能吧整数类型添加到集合中。
泛型优点3:二进制代码的重用。
泛型允许更好地重用二进制代码。泛型类定义一次,用许多不同的类型实例化。
泛型类型可以在一种语言中定义,在另一种.Net
语销纳言中使用。
泛型优点4:代码扩展。
CLR2.0(.Net
3.5
基于CLR2.0)提供了泛型。有了泛型,就不需要Objcet类。
System.Collections.Generic命名空间中的List
<T>类不使用对象,而是在使用定义类型。
泛型优点1:性能。
值类型存储在堆栈上,引用类型储存在堆上。
C#类是引用类型,结构是值类型。.Net很容易把值类型转换为引用类型。所以可以在需要对象(对象是引用类型)的任意地方使用值类型。
例如:int可以赋予一个对象,从值类型转换为引用类型成为装箱,如果方法需要吧一个对象作为参数,而且传送了一个值类型。装箱操作就会自动进行。另一方面,装箱的值类型可以使用拆箱操作转换为值类型。在拆箱时,需要使用类型转换运算符。
装箱和拆箱操作性能损失比较大。遍历许多项时尤其如此。
System.Collections.Genriec名称空间中的List<T>类不使用对象,而是在使用时定义类型。当List<T>的泛型类型定义为int,int类型在JIT编译器动态生成的类中使用,不再进行装箱和拆箱操作
泛型优点2:类型安全
如果在ArrayList类中添加一个整数、一个字符串、一个MyClass类型的对象,如果这个集合使用Foreach语句迭代并转换为Int那么会出现异常。
在泛型类List<T>中,泛型类型T定义了允许使用的类型。有了List<int>的定义。就只能吧整数类型添加到集合中。
泛型优点3:二进制代码的重用。
泛型允许更好地重用二进制代码。泛型类定义一次,用许多不同的类型实例化。
泛型类型可以在一种语言中定义,在另一种.Net
语销纳言中使用。
泛型优点4:代码扩展。
展开全部
一次全告诉你吧。
1.C#里的泛型是类型安全的,定义的时候使用T,D占位标示,但是实例化一个实例的时候必须制定明确的类型,不存在类型上的转换谨裂。
2.C#的泛型性能更好,为什么呢?这个是相对使用继承而言的,实现类似祥缓闭的功能你当然可以使用Object作为基类,这样你就可以什么类型都传了,但是使用泛型,他在编译的时候使用替换占位标示的方式,先比哪运之下不就是省去了装箱和拆箱的过程吗?
1.C#里的泛型是类型安全的,定义的时候使用T,D占位标示,但是实例化一个实例的时候必须制定明确的类型,不存在类型上的转换谨裂。
2.C#的泛型性能更好,为什么呢?这个是相对使用继承而言的,实现类似祥缓闭的功能你当然可以使用Object作为基类,这样你就可以什么类型都传了,但是使用泛型,他在编译的时候使用替换占位标示的方式,先比哪运之下不就是省去了装箱和拆箱的过程吗?
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你说的不懂哦拦槐,所谓的泛型就是集合,只是把目标只存进去。就好像在PHP中从数据库中读取的数据存入数组中一样一喊衡滚样的。只是叫的名称不郑余一样而已。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
没错行哗迹,对不同的参数会生成不同的类型
想验证可以用一个static变量,芦枯看看不同类档并型是不是有不同的值
想验证可以用一个static变量,芦枯看看不同类档并型是不是有不同的值
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询