0

0

C# 结构体和类的选择 C#什么时候应该用struct代替class

煙雲

煙雲

发布时间:2026-02-04 09:34:02

|

792人浏览过

|

来源于php中文网

原创

struct适合值语义、体积小(≤16字节)、不可变的小型数据类型,如坐标点、颜色;class适合需引用语义、多态、生命周期管理或较大实例的场景。

c# 结构体和类的选择 c#什么时候应该用struct代替class

结构体适合值语义且体积小的场景

当数据本质上是“值”而非“对象”,比如坐标点、颜色、时间跨度,且实例大小通常不超过16字节时,struct更合适。它在上分配(多数情况),避免堆分配和GC压力,访问局部性好。但要注意:.NET对struct有隐式装箱成本,一旦传给object或接口类型就会触发,反而更慢。

  • 推荐尺寸:字段总大小 ≤ 16 字节(如 int x, y;float r,g,b,a;
  • 必须是不可变或显式控制可变性的设计(避免意外副本导致逻辑错乱)
  • 不要继承、不能有无参构造函数(编译器强制)、不能有析构函数
  • 泛型约束中可用 where T : struct 限定只接受值类型

类更适合需要引用语义或复杂行为的类型

class 是默认选择,尤其当你需要多态、生命周期管理、事件、属性通知(INotifyPropertyChanged)、依赖注入容器托管,或者实例可能很大(如缓存数据块、树节点)时。struct无法被继承,也不能安全地实现 IDisposable(因为复制后资源归属不明确)。

  • 有状态的业务实体(如 OrderUser)几乎总是 class
  • 需要虚方法、抽象基类、接口实现(尤其是带状态的)应选 class
  • 集合元素如果是 struct,在 List 中会被复制多次;而 class 只传引用,更轻量
  • async 方法中捕获的局部 struct 变量可能被提升到状态机类中,失去值类型优势

常见误用:把“小”等同于“适合用 struct”

一个 struct 即使只有两个 int,如果它常被装箱(例如放进 ArrayList、作为 Dictionary 的 value、调用非泛型接口方法),性能反而比 class 差。.NET Core 2.1+ 的 SpanReadOnlySpan 是特例——它们是 ref-like 类型,只能栈分配,但这不是普通 struct 的使用模式。

Thiings
Thiings

免费的拟物化图标库

下载
  • 避免在泛型非约束上下文中把 structobject
  • 别为了“避免 new”而强行用 structnew MyClass() 在现代 .NET 中堆分配开销极低
  • dotnet-counters 或 BenchmarkDotNet 验证实际分配行为,而不是凭直觉

一个快速判断 checklist

遇到新类型定义时,问自己这五条:

  • 它的相等性是否应该基于字段逐个比较?→ 是,倾向 struct
  • 是否需要把它当作“同一个东西”被多个地方修改?→ 是,必须用 class
  • 是否会频繁作为参数传入非泛型方法(如 void Log(object o))?→ 是,避开 struct
  • 是否包含引用类型字段(如 stringList)?→ 是,struct 复制开销大,且易引发意外共享
  • 是否要序列化为 JSON 或 ProtoBuf?→ 查目标库文档:有些对 struct 支持弱(如旧版 Newtonsoft.Json 默认忽略无参构造)

最常被忽略的一点:struct 的默认构造函数永远存在且不可禁用,它会把所有字段设为 0 / null / default(T),哪怕你写了带参构造——这点和 class 的行为不一致,容易在初始化逻辑里埋坑。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

425

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

538

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

313

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

78

2025.09.10

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

310

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

222

2025.10.31

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

563

2023.08.02

css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

580

2024.04.28

全国统一发票查询平台入口合集
全国统一发票查询平台入口合集

本专题整合了全国统一发票查询入口地址合集,阅读专题下面的文章了解更多详细入口。

36

2026.02.03

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.8万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.2万人学习

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

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