news 2026/4/27 14:26:56

# 深入解析 C# 中类(class)与结构(struct)的异同

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
# 深入解析 C# 中类(class)与结构(struct)的异同

在 C# 这门以类型系统著称的面向对象语言中,class(类)struct(结构)是两种最核心、也最容易被混淆的类型定义方式。

它们都可以封装数据与行为,但在内存模型、语义设计、继承能力、性能特征等方面存在本质差异。理解这些差异,不仅关系到代码正确性,更直接影响系统性能与可维护性。


一、共同点:class 与 struct 能做什么是一样的?

尽管底层语义不同,class 与 struct 在语言层能力上高度一致:

  • 封装能力

    • 都可以定义字段(Field)、属性(Property)、方法(Method)、索引器(Indexer)、事件(Event)
    • 均支持运算符重载
  • 接口实现

    • 都可以实现一个或多个接口(Interface)
  • 访问控制

    • 支持public/private/protected/internal
  • 泛型支持

    • 都可作为泛型参数
    • 都可定义为泛型类型(class<T>/struct<T>
  • 构造函数

    • 都支持参数化构造函数(struct 有额外约束)

👉结论

从“能写什么代码”来看,class 与 struct 非常相似;
真正的差异,来自于它们的类型语义与内存模型


二、本质差异:引用类型 vs 值类型

维度classstruct
类型本质引用类型(Reference Type)值类型(Value Type)
默认内存位置托管堆(Heap)取决于宿主(通常为栈)
继承能力支持单继承不支持继承(隐式继承 ValueType)
构造函数可自定义无参 / 有参不可自定义无参,必须初始化全部字段
析构函数支持(由 GC 调用)不支持
赋值语义引用拷贝值拷贝
可空性默认可为null默认不可为null
GC 影响需要 GC 回收栈上无 GC,堆上随宿主回收
装箱拆箱不存在转 object / interface 会发生

三、几个最容易踩坑的关键差异

1️⃣ 值拷贝 vs 引用拷贝(核心中的核心)

Animal a1 = new Animal("Dog"); Animal a2 = a1; a2.Species = "Husky"; Console.WriteLine(a1.Species); // Husky
  • class:变量中存的是引用地址
  • 多个变量 → 同一个对象
Cat c1 = new Cat("橘猫"); Cat c2 = c1; c2.Name = "布偶猫"; Console.WriteLine(c1.Name); // 橘猫
  • struct:变量中存的是完整数据副本
  • 修改副本不会影响原值

⚠️ 注意:值拷贝 ≠ 逻辑深拷贝

  • 如果 struct 内部包含引用类型字段,只会拷贝引用本身

2️⃣ struct 的内存位置并不“一定在栈上”

struct 的存储位置,取决于它的宿主
  • 局部变量 → 通常在栈
  • class 字段 → 在堆
  • 数组元素 → 在堆
  • async / iterator → 可能被提升到堆

👉不要用“struct 在栈上 / class 在堆上”作为绝对判断


3️⃣ struct 的构造函数限制

struct Point { public int X; public int Y; public Point(int x, int y) { X = x; Y = y; // 必须初始化所有字段 } }
  • ❌ 不允许自定义无参构造函数
  • ✅ 参数化构造函数必须初始化全部字段
  • 编译器始终保留一个“零值初始化路径”

四、代码对比示例(精简直观)

// struct:值语义 struct Cat { public string Name; public Cat(string name) => Name = name; } // class:引用语义 class Animal { public string Species; public Animal(string species) => Species = species; }
Cat c1 = new Cat("A"); Cat c2 = c1; c2.Name = "B"; // c1 不受影响 Animal a1 = new Animal("Dog"); Animal a2 = a1; a2.Species = "Cat"; // a1 被影响

五、如何选择?实战决策指南

✅ 优先选择 struct 的场景

  • 小而简单的数据结构(2~4 个字段)
  • 强调值语义(数学、坐标、金额)
  • 高频创建、短生命周期
  • 不可变对象(readonly struct)

典型示例:

  • int/DateTime/Guid
  • Point/Vector/Color

✅ 优先选择 class 的场景

  • 复杂业务对象
  • 需要继承 / 多态
  • 生命周期较长
  • 需要 null 表示“不存在”

典型示例:

  • User/Order
  • Service/Controller
  • 领域模型(Domain Model)

六、面试高频问题(附标准回答)

下面问题均来自C# / .NET 中高级面试真实高频题,可直接背诵使用。


Q1:class 和 struct 的本质区别是什么?

标准回答:

class 是引用类型,struct 是值类型。
class 变量保存的是对象引用,多个变量可指向同一实例;
struct 变量保存的是实际数据,赋值会产生值拷贝。


Q2:struct 一定分配在栈上吗?

标准回答:

不一定。struct 的存储位置取决于它的宿主。
作为局部变量时通常在栈上,作为类字段或数组元素时分配在堆上。


Q3:为什么 struct 不支持继承?

标准回答:

struct 的设计目标是轻量级值语义,如果允许继承会引入对象身份、多态和额外间接层,破坏其性能和语义一致性。


Q4:什么时候不应该使用 struct?

标准回答:

当对象体积较大、需要继承、多态,或生命周期较长时,不应使用 struct,否则会导致频繁值拷贝和性能下降。


Q5:struct 作为方法参数时会发生什么?

标准回答:

默认情况下会发生值拷贝,方法内部修改不会影响原变量。
可通过ref/in/out传递以避免拷贝。


Q6:什么是装箱和拆箱?什么时候发生?

标准回答:

当 struct 被转换为 object 或接口类型时会发生装箱(值复制到堆)。
从 object 再转回 struct 时发生拆箱。
装箱拆箱会产生额外分配和性能开销。


Q7:为什么 struct 不能定义无参构造函数?

标准回答:

因为 CLR 必须保证所有 struct 都可以被零值初始化,允许自定义无参构造函数会破坏这一约定。


Q8:readonly struct 有什么作用?

标准回答:

readonly struct 保证实例不可变,可避免 defensive copy,提高性能和线程安全性。


Q9:record struct 和 record class 有什么区别?

标准回答:

record struct 是值语义,record class 是引用语义。
二者都提供值相等性、解构和 with 表达式,但内存与拷贝语义不同。


Q10:实际项目中如何选择 class 还是 struct?

标准回答:

判断标准不是性能,而是语义:

  • 需要对象身份、继承、多态 → class
  • 表示纯数据、值语义、短生命周期 → struct

七、一句话总结(面试 & 记忆版)

class = 引用语义 + 继承 + 复杂对象
struct = 值语义 + 轻量数据 + 性能友好

终极判断标准:

👉你关心的是“对象身份”,还是“数据本身”?

class = 引用语义 + 继承 + 复杂对象
struct = 值语义 + 轻量数据 + 性能友好

选择标准不是“性能迷信”,而是:

👉你要的是“对象身份”,还是“数据本身”?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/28 9:12:40

基于单片机的电加热炉智能温度与液位PID控制系统设计

系统总体设计概述 点击链接下载设计资料&#xff1a;https://download.csdn.net/download/m0_51061483/91939253 1.1 设计背景与研究意义 随着工业自动化水平的不断提升&#xff0c;传统电加热炉在温度调节、液位控制以及安全保护方面逐渐暴露出响应慢、控制精度低、人工干预…

作者头像 李华
网站建设 2026/4/21 9:45:10

外企人才战略持续迭代,用友HR SaaS以数智化破局!

当不确定性成为全球商业常态&#xff0c;第八届中国国际进口博览会以 834.9 亿美元意向成交额再创历史新高&#xff0c;向世界传递出中国市场的坚定确定性。这场东方之约既印证了中国市场在全球经济格局中的独特价值&#xff0c;也揭示了在华外企发展的新逻辑 —— 亮眼成绩单背…

作者头像 李华
网站建设 2026/4/24 4:53:31

VB编程的现代实践:从经典到创新的全面指南

VB编程的现代实践:从经典到创新的全面指南 你是否想过,那个让你在Windows 95时代疯狂拖拽控件的VB,如今竟能驾驭云计算甚至量子计算?这可不是科幻小说的情节——让我们掀开VB三十年进化史的神秘面纱,探索它如何从“玩具语言”蜕变为企业级开发的瑞士军刀。 一、VB语言的前…

作者头像 李华
网站建设 2026/4/20 23:37:34

狂中Nature子刊!CNN-LSTM做时间序列预测火力全开,思路非常上头!

在处理兼具局部相关性与长期依赖性的复杂时序数据时&#xff0c;CNN-LSTM是个非常可靠和有效的选择。因为它通过分工协作有效解决了关键矛盾&#xff0c;这方面比单一模型更全面、更稳健。但从创新角度来说&#xff0c;CNN-LSTM做时序预测研究范式已经发生了深刻变化&#xff0…

作者头像 李华
网站建设 2026/4/22 14:40:21

千匠供应链商城系统:AI赋能、灵活部署,全力助推产业互联网平台建设与发展

千匠供应链商城系统以中台架构为核心&#xff0c;凭借其针对性的系统定位、强大的核心功能、先进的技术架构、广泛的应用场景和显著的实施价值&#xff0c;为企业打造深度整合采销一体化、交易撮合、全链路管理等多项功能的产业供应链平台&#xff0c;助力企业实现转型升级。系…

作者头像 李华