讲师中心 微信公众号
AI工具推荐 视频效率加速

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

胖宇小哥_7128

胖宇小哥_7128

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

|

872人浏览过

|

来源于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(因为复制后资源归属不明确)。

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

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

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

dmap-jsapi-skill
dmap-jsapi-skill

DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。

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

一个快速判断 checklist

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

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

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

热门AI工具

更多
切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

相关专题

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

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

2175

2023.08.07

json是什么
json是什么

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

3362

2023.08.23

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

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

1136

2023.10.13

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

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

3859

2025.09.10

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

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

3051

2023.10.31

php数据类型
php数据类型

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

554

2025.10.31

c语言 数据类型
c语言 数据类型

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

522

2026.02.12

string转int
string转int

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

6579

2023.08.02

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

20

2026.10.22

热门下载

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

精品课程

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

共101课时 | 21.1万人学习

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

共39课时 | 4.9万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn