结构体和类对比
来源:互联网 发布:windows远程桌面mac版 编辑:程序博客网 时间:2024/06/10 12:01
今天看报纸,看到结构两个字就让我联想起“结构体”这个东东,可想我对编程时多么热爱阿,时刻都能想起跟程序有关的东东(中毒太深)。
然后我就想起好像在项目中很少用到结构体,大多用是用类替换了结构体,其实结构体在必要的时候还是需要使用的。
先讲讲结构体的优点吧.
结构是值类型,继承自System.ValueType。结构相对于类来说有两个性能上的优势,结构通常分配在栈(Stack)上面,类的实际内容通常分配在堆(Heap)上面,访问栈的速度会比访问堆的速度更快。但是这并不是一个明显的优势。最主要的是栈上面的内容释放是非常快的,通常在函数调用结束以后,栈就自动释放了;但是对于堆来说,必须等待垃圾收集器(Garbage Collector)来收集,往往垃圾收集器的工作都有滞后特性,所以我们不一定当时就能注意到性能的变化,但是这种影响终究会体现出来。
结构体数组效率比类数组效率高(不需要装箱合拆箱)。
再讲讲结构体的弱点吧。
作为参数传递的时候效率低
装箱(Boxing)和解箱(Unboxing)效率低,如:结构体集合(如Hashtable)效率比类集合效率低。集合的元素是引用类型,所以结构体必须进行装箱和拆箱处理。所以类在大的集合中更有效率。
那么我们最终关心的是:什么时候用结构体,什么时候用类
在下面这种情况中使用结构体:
1 希望能够象原始类型(比如int,double之类的)一样使用它。比如我们可以声明一个复数结构,然后像double类型一样地使用它。
2 需要的内存较少,栈可以完全地容纳它。
3 想避开垃圾收集器的处理,自己掌握资源的释放。
4 只需要缺省的值,而不需要在声明字段的时候赋值。
5 不需要从基类继承,当然,不包括ValueType。
6 不需要多态行为。
在下面这种情况中使用类:
1 内容很多的时候,因为结构总是暗地里拷贝了一个临时变量。
2 需要非常多内存的时候,因为栈的容量有限,而堆通常是足够使用的。
3 需要在声明字段的时候进行初始化。
4 需要从基类继承。
5 需要多态性。接口也可以用来实现多态性,但是因为结构是值类型,尽管它可以从接口继承,但是在多态过程中会进行装箱和解箱的操作。
最后我们用表格罗列两者的区别:
比较内容
结构
类
构造函数
支持(不能自定义,默认提供,作用是将所有的数据成员置零)
支持(能自定义)
析构函数
不支持
支持
变量初始化
不支持(private int num = 50 是错误的)
支持
继承
不支持(sealed类型)
支持
接口
可以实现多个接口
可以实现多个接口
特性
支持
支持
属性
支持
支持
方法
支持
支持
类型
值类型
引用类型
- 结构体和类对比
- 结构体和类对比
- 结构体和类对比
- C和C++中的结构体对比
- memcmp对比结构体
- vector 查找/查找和对比结构体元素值
- 结构体和类
- 结构体和类
- 结构体和类
- 类和结构体
- 结构体和类
- 类和结构体
- 类和结构体
- 结构体和类
- 结构体和类
- 类和结构体
- 类和结构体
- 结构体和类
- 简单正则式匹配
- 读书记录
- 大学毕业后拉开差距的原因
- 终于点亮ARM的第一个LED了。。。
- Linux-2.6.28内核移植及Yaffs文件系统制作 for FL2440(二)
- 结构体和类对比
- Copy_from&to_user详解
- 很强大的input
- from ibatis3.x to mybatis
- ORACLE和SQL语法区别归纳
- 一个不错的网站(素材网)
- NS2里节点结构图
- MD5 算法入门 --CLP
- Microsoft Project 开发