A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 莫洪刚 中级黑马   /  2012-2-19 13:46  /  2402 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

类和结构的区别是什么?他们对性能有影响吗?在自定义类型时,选择类还是结构?

评分

参与人数 2技术分 +1 黑马币 +2 收起 理由
什麽才是王道 + 2 神马都是浮云
郑文 + 1

查看全部评分

3 个回复

倒序浏览
两者都具有成员,成员可以包括构造函数、方法、属性、字段、常数、枚举、事件和事件处理程序

结构是“值类型”,而类是“引用类型”。结构类型的变量包含此结构的数据,而不是像类类型那样包含对数据的引用。

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
结构是值类型,继承自System.ValueType。结构相对于类来说有两个性能上的优势,结构通常分配在栈(Stack)上面,类的实际内容通常分配在堆(Heap)上面,访问栈的速度会比访问堆的速度更快。但是这并不是一个明显的优势。最主要的是栈上面的内容释放是非常快的,通常在函数调用结束以后,栈就自动释放了;但是对于堆来说,必须等待垃圾收集器(Garbage Collector)来收集,往往垃圾收集器的工作都有滞后特性,所以我们不一定当时就能注意到性能的变化,但是这种影响终究会体现出来。


    结构体数组效率比类数组效率高(不需要装箱合拆箱)。



再讲讲结构体的弱点吧。

     作为参数传递的时候效率低

     装箱(Boxing)和解箱(Unboxing)效率低,如:结构体集合(如Hashtable)效率比类集合效率低。集合的元素是引用类型,所以结构体必须进行装箱和拆箱处理。所以类在大的集合中更有效率。



那么我们最终关心的是:什么时候用结构体,什么时候用类

在下面这种情况中使用结构体:


      1 希望能够象原始类型(比如int,double之类的)一样使用它。比如我们可以声明一个复数结构,然后像double类型一样地使用它。
      2 需要的内存较少,栈可以完全地容纳它。
      3 想避开垃圾收集器的处理,自己掌握资源的释放。
      4 只需要缺省的值,而不需要在声明字段的时候赋值。
      5 不需要从基类继承,当然,不包括ValueType。


      6 不需要多态行为。

评分

参与人数 1技术分 +3 收起 理由
郑文 + 3

查看全部评分

回复 使用道具 举报
结构是值类型,类是引用类型,这样说,你应该很明白它们的区别了吧!二者都可以具有构造函数,方法,属性等...
至于在性能上,我个人的观点更倾向于引用类型,也就是类!

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马