(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)在大多数情况下,该类型只是一些数据时,结构是最佳的选择。
|