类和结构是 .NET Framework 通用类型系统的两种基本构造。 每种本质上都是一种数据结构,其中封装了同属一个逻辑单元的一组数据和行为。 数据和行为是类或结构的成员,包括方法、属性和事件等。
官方给出的结构体与类的区别: 🔗
# 区别
- 语义上区分,类使用class关键字,结构体使用struct表示;
- 类是引用类型,结构体是值类型;
- 结构体不能包含显示的无参构造函数(默认生成隐式的无参构造函数),类可以;
- 结构体的显示有参构造函数,必须为字段和属性完全赋值(隐式无参构);
- 结构类型不能从其他类或结构类型继承,也不能作为类的基础类型。 但是,结构类型可以实现接口;
- 类有析构函数,结构体无法创建析构函数;
# 分析过程
创建一个空的类与结构体
// 空类
public class ClassType { }
// 空结构体
public struct StructType { }
查看 IL
// 类
.class public auto ansi beforefieldinit DiffofStructVsClass.ClassType
extends [mscorlib]System.Object
{
} // end of class DiffofStructVsClass.ClassType
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// 代码大小 8 (0x8)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: nop // 无操作
IL_0007: ret
} // end of method ClassType::.ctor
// 结构体
.class public sequential ansi sealed beforefieldinit DiffofStructVsClass.StructType
extends [mscorlib]System.ValueType
{
.pack 0
.size 1
} // end of class DiffofStructVsClass.StructType
类继承自 System.Object 类,而结构体继承 System.ValueType ,所以 类是引用类型,而结构体是值类型。
结构体创建显示的无参构造函数时,编译器会提示:
结构不能包含显示的无参数构造函数
结构体创建显示的有参构造函数时,如果字段为赋值,编译器会提示:
在控制返回调用方之前,字段“*”必须完全赋值
# Reference
https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/
委托和事件 →