类:类是引用类型在堆上分配,类的实例进行赋值只是复制了引用,都指向同一段实际对象分配的内存类有构造和析构函数类可以继承和被继承
结构体:结构体是值类型在栈上分配(虽然栈的访问速度比较堆要快,但栈的资源有限放),结构体的赋值将分配产生一个新的对象。结构体没有构造函数,但可以添加。结构体没有析构函数结构体不可以继承自另一个结构体或被继承,但和类一样可以继承自接口。
结构体和类的联系
1、定义和使用非常相似
例子如下:
public struct Student
{
string Name;
int Age;
}
public class QuesTIon
{
int Number;
string Content;
}
使用:
Student s=new Student();
QuesTIon q=new QuesTIon();
2、两者都是container类型:这表示它们可以包含其他数据类型作为成员。
3、两者都拥有成员:包括:构造函数、方法、属性、字段、常量、枚举类型、事件、以及事件处理函数。
4、两者的成员都有其各自的存取范围。例如,可以将某一个成员声明为Public,而将另一个成员声明为Private。
5、两者都可以实现接口。
6、两者都可以公开一个默认属性,然而前提是这个属性至少要取得一个自变量。
7、两者都可以声明和触发事件,而且两者都可以声明委托(Delegate)。
结构体和类的区别
1、存储类型:结构是值类型,存储在栈上。类是引用类型,存储在栈上和堆上,堆上存储真实数据,栈上存储存储地址,修改一个引用的值,另一个相同的引用的值就会发生改变。
2、继承性:类是可以继承的,它可以继承其他的类或者接口,也可以被继承,并且,类的许多特性是通过继承来展现的,要阻止类的继承,必须显示的声明sealed。结构没有继承:它不能继承另一个结构或者类,也不能被继承。也正因为如此,结构不能有抽象成员。虽然结构没有明确的用sealed声明,可是结构是隐式的。结构能够继承接口,方法和类继承接口是一样的。
3、初始化:类可以在声明的时候初始化,结构不能在申明的时候初始化(不能在结构中初始化字段),否则报错。
4、构造函数:类和结构都有自己默认的构造函数。在类中,一旦我们编写了带参数构造函数,默认构造函数就不存在了。当我们要调用不带参数的构造函数来初始化对象时,我们必须再自己编写一个不带参数的构造函数。但是在结构中,始终存在一个不带参数的默认构造函数,并且,这个构造函数是不可替代的,不能重写,也不能覆盖,在结构中,我们只能编写带参数的构造函数,不能编写不带参数的构造函数。
5、析构函数:类有析构函数,但是结构没有析构函数。
6、关键字:在类中可以使用但是在结构中限制使用的关键字有:abstract、sealed、protected;StaTIc关键字可以用在类名前面用来声明静态类,但是不能用在struct前面,不存在静态结构。
使用说明
结构存储在栈中,而栈有1个特点,就是空间较小,但是访问速度较快,堆空间较大,但是访问速度相对较慢。所以当我们描述1个轻量级对象的时候,可以将其定义为结构来提高效率。比如点,矩形,颜色,这些对象是轻量级的对象,因为描述他们,只需要少量的字段。当描述1个重量级对象的时候,我们知道类的对象是存储在堆空间中的,我们就将重量级对象定义为类。 他们都表示可以包含数据成员和函数成员的数据结构。与类不同的是,结构是值类型并且不需要堆分配。结构类型的变量直接包含结构的数据,而类类型的变量包含对数据的引用(该变量称为对象)。 struct 类型适合表示如点、矩形和颜色这样的轻量对象。尽管可能将一个点表示为类,但结构在某些方案中更有效。在一些情况下,结构的成本较低。例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。所以结构适合表示1个轻量级对象。
根据以上比较,我们可以得出一些轻量级的对象最好使用结构体,但数据量大或有复杂处理逻辑对象最好使用类。
技术专区
- mybatis动态sql详解
- 用VHDL语言设计数据传输系统中的HDB3编码器
- 裸机程序如何驱动硬件?看前辈是怎么说的
- 应用面向对象编程SoC原则的典型示例
- 嵌入式开发之java常用开发工具介绍