0

0

C# 结构体(struct)和类(class)的本质区别 - 栈内存与堆内存的分配

畫卷琴夢

畫卷琴夢

发布时间:2026-01-11 01:01:14

|

831人浏览过

|

来源于php中文网

原创

结构体是值类型,分配在栈上,赋值时深拷贝数据,修改副本不影响原值;类是引用类型,实例在堆上,栈中存引用,赋值为浅拷贝,多个变量指向同一对象,修改相互影响。struct 不能继承、无默认构造函数、字段不可直接初始化(C#10前),且不支持null;class 支持继承、多态、构造函数及null赋值。小数据用 struct 提升性能,避免GC;复杂逻辑或大数据用 class。频繁复制大 struct 反而降低效率,且含引用字段易引发意外行为。栈与堆的差异直接影响赋值、传参和比较操作的行为本质。

c# 结构体(struct)和类(class)的本质区别 - 栈内存与堆内存的分配

结构体是值类型,直接在上分配内存;类是引用类型,实例在堆上分配,变量只存指向堆中对象的引用。

内存分配位置决定行为差异

struct 实例(如 Point p = new Point(1, 2);)整个数据(比如两个 int 字段)就放在栈里,复制时是整块拷贝;class 实例(如 Person person = new Person();)实际对象存在堆中,栈上只存一个 4 或 8 字节的引用(指针),赋值或传参只是复制这个引用,不复制对象本身。

赋值和参数传递表现不同

struct 赋值是深拷贝:修改副本不影响原值;class 赋值是浅拷贝引用:两个变量指向同一块堆内存,改其中一个会影响另一个。

  • struct 示例:var a = new Point(10, 20); var b = a; b.X = 100; // a.X 仍是 10
  • class 示例:var x = new Person { Name = "Alice" }; var y = x; y.Name = "Bob"; // x.Name 变成 "Bob"

默认构造与可空性限制

struct 总有隐式无参构造,不能显式定义无参构造函数,且不能为 null(除非用 NullableT?);class 可以定义任意构造函数,变量默认为 null,支持继承和多态。

ClippingMagic
ClippingMagic

魔术般地去除图片背景

下载
  • struct 不能继承其他 struct 或 class(但可实现接口)
  • class 支持继承、虚方法、抽象、密封等面向对象特性
  • struct 实例字段不能在声明时直接初始化(C# 10+ 允许 init-only 成员,但仍有约束)

性能与使用场景建议

小而简单的数据载体(如坐标、颜色、金额)优先用 struct,避免堆分配和 GC 压力;逻辑复杂、需多态、生命周期长或体积较大(一般超过 16 字节)的对象,必须用 class。

  • 过度使用 struct 反而降低性能:频繁拷贝大结构体比引用传递更耗时
  • 误将 struct 设计得过大或带引用字段,会模糊值语义,增加意外行为风险
  • 跨线程或异步上下文中,struct 的值语义更安全(无共享状态)

基本上就这些。栈 vs 堆不是表面概念,它直接决定了你写的每一行赋值、传参、比较代码到底在发生什么。

相关专题

更多
c#是什么意思
c#是什么意思

C#是一种通用的面向对象编程语言,它在.NET框架上运行,可用于开发各种类型的应用程序。本专题为大家提供c#相关的各种文章、以及下载和课程。

260

2023.08.08

什么是c#
什么是c#

C#(读作C Sharp)是一种现代的、通用的、面向对象的编程语言。它由微软公司开发,于2000年首次发布,主要用于开发Windows桌面应用程序、Web应用程序、移动应用程序以及游戏开发等领域。C#是一种类型安全和托管的编程语言,它结合了C++的强大性能和C语言的简单易学特点,并引入了许多新的特性和概念,如委托、属性、泛型和异步编程等,以提高开发效率和代码可维护性。

180

2023.08.31

C#中base关键字的用法
C#中base关键字的用法

在C#中,base关键字用于访问当前类的基类成员,这包括基类的字段、属性、方法、构造函数、索引器以及事件。想了解更多C#的相关内容,可以阅读本专题下面的文章。

294

2024.03.13

C#Task用法
C#Task用法

Task在C#中是用于表示异步操作的对象,它位于System.Threading.Tasks命名空间中。想了解更多C#中各种用法的相关内容,可以阅读本专题下面的文章。

347

2024.03.14

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

231

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

435

2024.03.01

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

54

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

49

2025.11.27

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

25

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MongoDB 教程
MongoDB 教程

共17课时 | 1.9万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

微信小程序开发之API篇
微信小程序开发之API篇

共15课时 | 1.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号