在 C# 中,结构体(struct) 和 类(class) 都可以用来定义数据结构,但它们在内存分配、继承、可变性等方面存在明显区别。
区别点 | 结构体(struct) | 类(class) |
---|---|---|
类型 | 值类型(Value Type) | 引用类型(Reference Type) |
内存分配 | 分配在**栈(Stack)**上(如果是局部变量) | 分配在**堆(Heap)**上(使用 new 创建) |
默认访问修饰符 | public ,结构体成员不能声明为Protected | private |
赋值方式 | 值拷贝(赋值时创建副本) | 引用拷贝(赋值时复制引用,多个引用指向同一对象) |
继承 | 不支持继承(不能被其他 struct 继承) | 支持继承(可以继承自其他 class ) |
接口 | 可以实现接口 | 可以实现接口 |
构造函数 | 不能显式的定义无参构造函数 | 可以定义无参构造函数 |
析构函数 | 不支持析构函数 | 支持析构函数(由 GC 管理,~ClassName() ) |
适用场景 | 小型数据对象(如 Vector3 、Color ) | 复杂对象、需要共享引用的对象 |
C# 结构体是值类型,类是引用类型,这一点是它们的核心区别。
csharpstruct 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 是独立的)
csharpclass 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 共享同一对象)
✅ 使用 struct
(结构体)
Vector3
)✅ 使用 class
(类)
特性 | 结构体(struct) | 类(class) |
---|---|---|
值类型/引用类型 | 值类型 | 引用类型 |
赋值方式 | 值拷贝 | 引用拷贝 |
存储位置 | 栈(Stack) | 堆(Heap) |
支持继承 | ❌ 不支持 | ✅ 支持 |
适用场景 | 小型、简单数据对象 | 复杂、长期存活的对象 |
结构体和类的选择应该根据具体的业务场景来决定。在性能敏感的场景下,如果数据对象较小且不需要共享,使用 struct
可能是更好的选择;而对于复杂对象,class
更加适合。
本文作者:xuxuxuJS
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!