结构体是值类型是储存在栈中独立储存的,数据与数据之间不会相互影响,即使将一个结构体赋值给另外一个结构体也不会相互影响。
类是一个模板,实例出来的对象是独立的不会相互影响,但是将一个对象赋值给另一个对象时 会把指向堆内存中数据的指针赋值给另一个对象.从而发生两个变量指向同一个堆内存 一个修改数据 另外一个也修改。
目录
[1. 数据类型本质](#1. 数据类型本质)
[2. 默认继承行为](#2. 默认继承行为)
[3. 实例化方式](#3. 实例化方式)
[4. 默认成员初始化](#4. 默认成员初始化)
[5. 构造函数特性](#5. 构造函数特性)
[6. 内存管理与生命周期](#6. 内存管理与生命周期)
[7. 比较行为](#7. 比较行为)
[8. 适用场景](#8. 适用场景)
在 C# 等面向对象编程语言中,结构体(Struct)和类(Class)是两种重要的数据类型,它们在内存管理、行为特性等方面存在显著区别。以下从多个维度详细说明二者的核心差异:
1. 数据类型本质
- 结构体(Struct) :属于值类型(Value Type) ,直接存储数据本身。
内存分配在栈(Stack) 上(或作为引用类型的一部分嵌入在堆中),当结构体变量被赋值、传递时,会创建完整的副本。 - 类(Class) :属于引用类型(Reference Type) ,存储的是数据的引用(地址)。
内存分配在堆(Heap) 上,变量仅保存指向堆中数据的指针,赋值或传递时仅复制引用(不会复制数据本身)。 - 类实例化出的对象(即类的实例)存储在堆(Heap)中,而指向该对象的引用(变量)则存储在栈(Stack)中。
2. 默认继承行为
- 结构体 :默认继承自
System.ValueType
(间接继承自object
),但不能继承其他类或结构体 ,也不能被其他类继承 ( sealed 特性)。
支持实现接口。 - 类 :默认继承自
object
,可以继承其他类 (单继承),也可以被其他类继承 (除非声明为sealed
)。
同样支持实现接口。
3. 实例化方式
- 结构体 :
- 可以不使用
new
关键字实例化(此时成员变量为默认值,如int
为 0)。 - 例如:
Point p; p.X = 10;
(Point
是结构体)。 - 使用
new
时,会调用构造函数初始化成员。
- 可以不使用
- 类 :
- 必须使用
new
关键字调用构造函数实例化(否则变量为null
,直接访问成员会报错)。 - 例如:
Person p = new Person();
(Person
是类)。
- 必须使用
4. 默认成员初始化
- 结构体 :
- 不能在声明时为成员变量设置默认值(需在构造函数中初始化)。
- 例如:
struct Point { public int X = 0; }
(编译错误)。
- 类 :
- 可以在声明时为成员变量设置默认值。
- 例如:
class Person { public int Age = 18; }
(合法)。
5. 构造函数特性
- 结构体 :
- 无默认无参构造函数(编译器不会自动生成,若手动定义构造函数,必须为所有成员赋值)。
- 例如:
struct Point { public int X; public Point(int x) { X = x; } }
(合法,因初始化了所有成员)。
- 类 :
- 编译器会自动生成默认无参构造函数(若未手动定义任何构造函数)。
- 可以定义有参构造函数,且无需显式初始化所有成员(未初始化的成员为默认值)。
6. 内存管理与生命周期
- 结构体 :
- 生命周期与所在作用域一致(如方法内的结构体变量,方法执行结束后栈内存自动释放)。
- 无需垃圾回收(GC),性能开销较低(适合小型数据结构)。
- 类 :
- 实例在堆上分配,生命周期由 GC 管理(当没有引用指向时,会被 GC 回收)。
- 存在 GC 开销,适合大型、复杂的对象(如业务实体)。
7. 比较行为
- 结构体 :
- 默认按值比较(比较所有成员是否相等)。
- 例如:两个
Point
结构体,若X
和Y
分别相等,则认为相等。
- 类 :
- 默认按引用比较(比较是否指向堆中同一个实例)。
- 例如:两个
Person
类实例,即使成员完全相同,若引用不同则认为不相等(需重写Equals
方法实现值比较)。
8. 适用场景
- 结构体 :
- 适合表示小型、简单的数据 (如坐标
Point
、颜色Color
、日期DateTime
等)。 - 强调数据的值语义(传递时需要副本),且无需继承或多态特性。
- 适合表示小型、简单的数据 (如坐标
- 类 :
- 适合表示复杂的对象 (如
User
、Order
等业务实体)。 - 需要继承、多态,或实例较大、需要长期存在(通过引用共享)的场景。
- 适合表示复杂的对象 (如
总结对比表
特性 | 结构体(Struct) | 类(Class) |
---|---|---|
数据类型 | 值类型 | 引用类型 |
内存分配 | 栈(或嵌入堆) | 堆 |
赋值 / 传递行为 | 复制值(副本) | 复制引用(共享实例) |
继承 | 不能继承 / 被继承(除接口) | 支持继承和被继承 |
实例化 | 可省略 new |
必须用 new |
成员默认值 | 不允许声明时初始化 | 允许声明时初始化 |
构造函数 | 无默认无参构造函数,需初始化所有成员 | 有默认无参构造函数,可部分初始化 |
比较方式 | 默认值比较 | 默认引用比较 |
适用场景 | 小型简单数据,值语义 | 复杂对象,引用语义,需继承多态 |
通过以上区别可以看出,结构体和类的选择主要取决于数据的复杂度、是否需要共享引用以及是否依赖继承多态等特性。

C# 结构体https://blog.csdn.net/LZQqqqqo/article/details/149511030?spm=1001.2014.3001.5502C# 面向对象__类_对象
https://blog.csdn.net/LZQqqqqo/article/details/149546454?spm=1001.2014.3001.5502