全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C#怎么使用结构体struct C# struct与class的区别和使用方法

struct是值类型,适合轻量、不可变、需值语义的数据封装;class是引用类型,适合有行为、状态和生命周期管理的对象。

结构体(struct)是C#中一种值类型,适合封装轻量级、不可变或逻辑上“像基本类型”的数据;而class是引用类型,适合建模具有行为和状态的对象。用对类型,能避免意外的性能开销和语义错误。

什么时候该用 struct

结构体适用于以下场景:

  • 数据简单、成员少(通常不超过4个字段),且主要用来“携带数据”,比如坐标点、颜色、时间间隔
  • 需要值语义——赋值时复制全部内容,而不是共享引用
  • 频繁创建/销毁(如循环内大量实例),希望减少GC压力(struct在栈上分配,小对象更高效)
  • 要与非托管代码交互(如P/Invoke),需满足内存布局可控(可加[StructLayout(LayoutKind.Sequential)]

例如定义一个二维整数点:

public struct Point
{
    public int X;
    public int Y;
public Point(int x, int y) => (X, Y) = (x, y);

}

struct 和 class 的核心区别

关键差异不在语法,而在运行时行为和设计意图:

  • 类型分类:struct 是值类型(继承自 System.ValueType),class 是引用类型
  • 内存分配:struct 实例默认在栈上(局部变量)或内联(作为字段嵌入类中);class 实例总在堆上,变量只存引用
  • 赋值行为:struct 赋值会逐字段复制(深拷贝语义);class 赋值只复制引用,两个变量指向同一对象
  • 默认构造函数:struct 不允许定义无参构造函数(编译器强制提供),但可定义带参构造;class 可自由定义任何构造函数
  • 继承限制:struct 不能继承其他 struct 或 class(不支持继承),但可实现接口;class 支持继承和多态
  • null 值:struct 本身不能为 null(除非是可空类型 Point?);class 引用默认为 null

使用 struct 的注意事项

结构体看似简单,但误用容易引发隐蔽问题:

  • 避免过大:单个 struct 超过16字节时,复制开销明显,建议改用 class
  • 避免可变性陷阱:不要在 struct 中暴露 public 字段并随意修改(易导致“副本被修改却没效果”)。推荐设为 readonly 字段 + 只读属性,或用 record struct(C# 10+)自动保证不可变
  • 慎用装箱:把 struct 赋给 object 或接口类型会触发装箱(堆分配),频繁操作抵消 struct 优势
  • 构造函数里必须初始化所有字段(编译器强制),否则报错
  • 不能有析构函数(~MyStruct() 不合法),也不能继承 System.Object 以外的类

推荐写法(C# 12):

public readonly record struct Size(int Width, int Height);

既不可变,又自动有相等性、ToString 等,语义清晰,无副作用。

何时选 class 更合适

别为了“轻量”硬套 struct。以下情况请果断用 class:

  • 对象有生命周期管理需求(如需要 Dispose、事件订阅、缓存内部状态)
  • 数据成员较多,或包含引用类型字段(此时 struct 复制反而更重)
  • 需要多态、继承、虚方法或抽象行为
  • 实例可能长期存活,或被多个地方共享引用
  • 后续可能扩展为复杂类型(struct 向 class 迁移成本高,涉及所有调用处的语义变更)

例如:FileStreamStringBuilderHttpClient 全是 class —— 它们不是“数据包”,而是有行为、状态和资源的实体。

基本上就这些。struct 不是 class 的简化版,而是不同语义的工具。用对了,代码更高效、更安全;用错了,bug 很难排查。记住:优先考虑“它在业务中代表什么”,再决定它是值还是引用。


# 字节  # 工具  #   # stream  # 区别  # c#  # Object  # NULL  # 封装  # 多态  # 构造函数  # 析构函数  # 局部变量  # 结构体  # 循环  # 继承  # 数据封装  # 接口  #   # class  # 值类型  # 引用类型  # 空类型  # public  # Struct  # FileStream  # 对象  # 事件  # bug  # 是有  # 多个  # 很难  # 什么时候  # 设为  # 而在  # 适用于  # 它是  # 错了 


相关文章: 如何在阿里云香港服务器快速搭建网站?  道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?  如何确认建站备案号应放置的具体位置?  宝塔面板如何快速创建新站点?  台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?  C++如何编写函数模板?(泛型编程入门)  如何快速使用云服务器搭建个人网站?  Python文件管理规范_工程实践说明【指导】  如何生成腾讯云建站专用兑换码?  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  javascript中的try catch异常捕获机制用法分析  c# 服务器GC和工作站GC的区别和设置  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  建站之星价格显示格式升级,你的预算足够吗?  开源网站制作软件,开源网站什么意思?  上海网站制作网站建设公司,建筑电工证网上查询系统入口?  建站之家VIP精选网站模板与SEO优化教程整合指南  官网建站费用明细查询_企业建站套餐价格及收费标准指南  如何做静态网页,sublimetext3.0制作静态网页?  在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?  如何基于云服务器快速搭建网站及云盘系统?  建站之星免费模板:自助建站系统与智能响应式一键生成  网站app免费制作软件,能免费看各大网站视频的手机app?  专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何用西部建站助手快速创建专业网站?  贸易公司网站制作流程,出口贸易网站设计怎么做?  如何登录建站主机?访问步骤全解析  如何快速搭建支持数据库操作的智能建站平台?  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?  图册素材网站设计制作软件,图册的导出方式有几种?  香港服务器租用每月最低只需15元?  如何注册花生壳免费域名并搭建个人网站?  全景视频制作网站有哪些,全景图怎么做成网页?  网站制作服务平台,有什么网站可以发布本地服务信息?  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  定制建站哪家更专业可靠?推荐榜单揭晓  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  建站之星代理如何获取技术支持?  如何快速搭建安全的FTP站点?  如何高效搭建专业期货交易平台网站?  如何在阿里云购买域名并搭建网站?  家庭建站与云服务器建站,如何选择更优?  高端网站建设与定制开发一站式解决方案 中企动力  香港服务器网站推广:SEO优化与外贸独立站搭建策略  建站之星微信建站一键生成小程序+多端营销系统  活动邀请函制作网站有哪些,活动邀请函文案?  如何在IIS管理器中快速创建并配置网站?  建站之星上传入口如何快速找到? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。