类和结构是 .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/

上次更新: 2020年 03月 25日 17:16:01