黑马程序员技术交流社区

标题: 结构和类的区别 [打印本页]

作者: 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