2023-04-01
编程语言
00

目录

1. 主要区别
2. 值类型 vs. 引用类型
结构体赋值(值拷贝)
类赋值(引用拷贝)
3. 何时使用结构体?何时使用类?
4. 总结

C# 结构体(struct)与类(class)的区别

在 C# 中,结构体(struct)类(class) 都可以用来定义数据结构,但它们在内存分配、继承、可变性等方面存在明显区别。


1. 主要区别

区别点结构体(struct)类(class)
类型值类型(Value Type)引用类型(Reference Type)
内存分配分配在**栈(Stack)**上(如果是局部变量)分配在**堆(Heap)**上(使用 new 创建)
默认访问修饰符public,结构体成员不能声明为Protectedprivate
赋值方式值拷贝(赋值时创建副本)引用拷贝(赋值时复制引用,多个引用指向同一对象)
继承不支持继承(不能被其他 struct 继承)支持继承(可以继承自其他 class
接口可以实现接口可以实现接口
构造函数不能显式的定义无参构造函数可以定义无参构造函数
析构函数不支持析构函数支持析构函数(由 GC 管理,~ClassName()
适用场景小型数据对象(如 Vector3Color复杂对象、需要共享引用的对象

2. 值类型 vs. 引用类型

C# 结构体是值类型,类是引用类型,这一点是它们的核心区别。

结构体赋值(值拷贝)

csharp
struct MyStruct { public int X; } MyStruct a = new MyStruct { X = 10 }; MyStruct b = a; // 这里是值拷贝,b 是 a 的副本 b.X = 20; Console.WriteLine(a.X); // 仍然是 10(a 和 b 是独立的)

类赋值(引用拷贝)

csharp
class MyClass { public int X; } MyClass a = new MyClass { X = 10 }; MyClass b = a; // 这里是引用拷贝,b 指向 a b.X = 20; Console.WriteLine(a.X); // 20(a 和 b 共享同一对象)

3. 何时使用结构体?何时使用类?

使用 struct(结构体)

  • 数据量小(通常不超过 16 字节)
  • 不可变对象(例如 Vector3
  • 不会被频繁修改
  • 没有继承需求
  • 短生命周期的对象

使用 class(类)

  • 数据量较大
  • 需要继承和多态
  • 需要共享引用(多个对象访问同一实例)
  • 生命周期较长,需要在堆上存储
  • 可能包含复杂逻辑和方法

4. 总结

特性结构体(struct)类(class)
值类型/引用类型值类型引用类型
赋值方式值拷贝引用拷贝
存储位置栈(Stack)堆(Heap)
支持继承❌ 不支持✅ 支持
适用场景小型、简单数据对象复杂、长期存活的对象

结构体和类的选择应该根据具体的业务场景来决定。在性能敏感的场景下,如果数据对象较小且不需要共享,使用 struct 可能是更好的选择;而对于复杂对象,class 更加适合。

本文作者:xuxuxuJS

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!