黑马程序员技术交流社区
标题: 结构和类的区别 [打印本页]
作者: xiabingxiejiang 时间: 2013-8-14 23:01
标题: 结构和类的区别
他们都能定义那些属性,什么时候用结构,什么时候用类?
作者: 杨敏Yummy 时间: 2013-8-15 04:07
(Hello,最近也在看面向对象,之前也有遇到过这个问题,其实网上的回答也挺多,我就参考了网上两篇主要的回答自己Copy整理了一下,希望可以帮到你,共同学习!)
结构体和类的区别:
1. 值类型与引用类型区别
结构是值类型,继承自System.ValueType类,它在栈上分配内存。所有的基类型都是结构类型。例如,int对应着System.Int32结构,string对应着System.String结构。通过使用结构可以创建更多的值类型。因为结构是值类型,所以结构之间赋值可以创建新的结构。复制包含结构的变量时,将Copy所有的数据,对新的copy中结构体的变量修改都不会影响原来的Copy中结构体中的变量。
类是引用类型,继承自System.Object类,它在堆上分配内存。类的实例进行赋值只是复制了引用,指向同一个实际对象分配的内存。
虽然栈的执行效率要比堆的执行效率高,可是栈的资源总是有限的,并不适合处理偏大的、逻辑复杂的对象。所以结构一般用来处理可以被作为基类型对待的小型对象,而类则被用来处理某个特定的商业逻辑。
Notes:
a. 虽然结构与类的类型不一样,但是他们的基类型都是对象(object)。在C#中,所有类型的基类型都是object。
b.虽然结构的初始化也使用了new操作符,但是结构对象依然分配在栈上。如果未使用new来初始化一个对象,那么结构中的所有字段将保持未赋值的状态,对象也无法使用。
2. 可继承性的区别
结构体没有继承性,无法从另外一个结构或者类继承,自身也不能被继承。虽然结构没有显式地用sealed声明,但它本身是隐式的sealed声明的。
类支持继承性,可以继承自类和接口,也可以被其他类所继承。除非类声明为sealed,否则可以继承自其他类的接口。
Notes:
虽然结构不能被继承,但是机构能够继承接口,下列为其代码示例:
interfaceIImage
{
void Paint ();
}
structPicture : IImage
{
public void Paint()
{
// Painting Code here
}
private int x, y, z; //其他结构成员
}
3.内部结构
结构:
(1)没有默认的无参构造方法,但是可以添加构造方法;结构可以声明构造方法,但是必须带有参数。
(2)没有析构函数。
(3)不存在abstract和sealed,因为不能被继承。不可以使用protected修饰符,不可以声明protected,virtual,sealed和override成员。
(4)可以不使用new关键字来初始化。因为结构在声明时就进行了初始化的过程,所有的成员变量均默认为0或者null。在结构中初始化实例字段是错误的。
(5)结构变量使用完之后就自动解除内存分配
(6)结构体创建的对象赋值简单,直接以等号连接
类:
(1)有默认的无参构造方法
(2)有析构函数
(3)可以使用abstract和sealed,也可以使用protected修饰符,可以声明protected,virtual,sealed和override成员。
(4)必须使用new关键字初始化
(5)类实例使用完之后有垃圾回收机制来保证内存的回收处理
(6)类创建的对象复制时氛围浅复制和深复制,需经过特殊的方法来完成。
Insum, 可以简单地理解为class是一个可以动的机器,有行为,有多台,有继承,而struct是一个零件箱,组合了不同结构的零件,其实class和struct最本质的区别在于class是引用类型,内存分配在托管堆,而struct是值类型,内存分配在线程堆栈上,此差异导致了上述的所有的不同。
类和结构的选择
如何根据不同的情形来选用类和结构:
(1)实现一个只用来存储数据的结构时,可以考虑使用结构体
(2)结构体变量使用的是栈内存空间,适用于数据处理量相对较小的场合;对于含有大量的复杂逻辑判断的对象,创建类要比创建结构更合适。
(3)结构用来表示如点、矩形、颜色这样的轻量对象;例如,如果声明一个含有1000个点的对象数组,则将为引用每个对象分配附加的内存,在此情况下,结构的成本较低。且结构数组具有更高的效率
(4)在表现抽象和多级别的对象层次时,类是最好的选择
(5)在大多数情况下,该类型只是一些数据时,结构是最佳的选择。
作者: 许庭洲 时间: 2013-8-15 06:29
1. Class可以被实例化,属于引用类型,是分配在内存的堆上的。类是引用传递的。
2. Struct属于值类型,是分配在内存的栈上的。结构体是复制传递的。
作者: 左岸 时间: 2013-8-19 19:40
类:类是引用类型在堆上分配,类的实例进行赋值只是复制了引用,都指向同一段实际对象分配的内存,类有构造和析构函数,类可以继承和被继承;结构:结构是值类型在栈上分配(虽然栈的访问速度比较堆要快,但栈的资源有限放),结构的赋值将分配产生一个新的对象,结构没有构造函数,但可以添加。结构没有析构函数,结构不可以继承自另一个结构或被继承,但和类一样可以继承自接口。
作者: yes 时间: 2013-8-23 14:40
struct只封装了数据,没有封装方法,class既封装了数据又封装了方法。由于struct是在栈上自动分配的,在某些使用场合可能要注意内存对齐等问题。
作者: 相许。 时间: 2013-8-25 20:55
结构是一种将有关数据打包到一起的机制,类似于数据库中的一条记录,相对于松散的数据是一种进步。但是结构并不能完善的表达面向对象的思想,他只能描述对象的性质如姓名,年龄等而无法描述对象的行为如行走,说话。而类则可以包含这些特征,也就是常说的类中可以包含成员变量(对象的性质)和成员函数(对象的行为)。此外,类还具有继承和多态的属性,实现了对象的繁衍。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |