C# 中值类型和引用类型的主要区别是什么?

C# 值类型和引用类型的区别?

💡 一句话速记:值类型存数据,赋值拷副本,位置看环境;引用类型存地址,赋值拷引用,对象必在堆。

核心语义(存储内容)的区别

  • 值类型:变量直接包含实际的数据。
  • 引用类型 :变量存储的是指向对象实例的引用(内存地址) ,实际数据存放在对象中。

赋值与传参的区别

  • 值类型 :赋值或作为参数传递时,会复制整个数据副本。修改新变量不会影响原变量。
  • 引用类型 :赋值或传递时,复制的是引用(地址) 。多个变量可能指向同一个对象,修改对象内容会相互影响。

内存分配位置的区别

  • 值类型 :存储位置取决于它被声明的上下文。如果是局部变量则分配在栈上;如果是引用类型(类)的字段或数组元素,则随对象一起分配在堆上。
  • 引用类型 :对象实例始终分配在托管堆上,而存储该对象地址的"引用变量"本身,分配位置同样取决于上下文(栈或堆)。

继承来源的区别

  • 值类型 :隐式继承自 System.ValueType(而该类最终也继承自 System.Object)。且值类型默认是密封的(sealed),不能被继承。
  • 引用类型 :直接或间接继承自 System.Object,通常可以被派生继承。

性能与开销的区别

  • 值类型:分配和回收成本低(无需垃圾回收 GC 参与),但如果数据体积较大,频繁传递和赋值时拷贝成本很高。
  • 引用类型:按引用传递成本低,但对象的创建需要在堆上分配内存,且最终需要垃圾回收器(GC)介入,会增加额外的系统开销。

值类型(Value Types)主要包括哪些?

顺口溜:整浮布字结枚。

  • 整型数值类型
  • 浮点型数值类型
  • 布尔类型(bool)
  • 字符类型(char)
  • 结构类型(struct type)
  • 枚举类型(enum type)

引用类型(Reference Types)主要包括哪些?

顺口溜:对字类接委动数。

  • 对象类型(object)
  • 字符串类型(string)
  • 类(class)
  • 接口(interface)
  • 委托类型(delegate)
  • 动态类型(dynamic)
  • 数组类型(array)

C#/.NET/.NET Core面试宝典

本文已收录至《C#/.NET/.NET Core面试宝典》中,查看更多C#/.NET/.NET Core面试题欢迎前往下面链接地址查看。

相关推荐
刚子编程10 小时前
我用 ASP.NET Core 做了个水稻病虫害检查系统
后端·asp.net
谢亮_vipxieliang10 小时前
用 PHP 构建轻量级 REST API:从路由到鉴权的完整实践
开发语言·后端·php
码事漫谈12 小时前
三步改掉 AI 味,附可直接复制的去 AI 味提示词
后端
IT_陈寒12 小时前
Redis卡顿的锅,这次真不是大key的错
前端·人工智能·后端
可乐鸡翅yeah_12 小时前
video.js 集成 hls.js 开发 M3U8 播放器,新手高频踩坑
开发语言·前端·javascript·后端·ecmascript·m3u8·音视频在线播放
程序猿_极客13 小时前
【免费】分享一套优质的基于SpringBoot的服装商城管理系统的设计与实现(带可视化图表、协同过滤功能),源码+文档+视频详解(讲解)
java·spring boot·后端·服装商城管理系统
明月_清风13 小时前
面对陌生的 GitHub 项目无从下手?这 4 个网站帮你快速读懂源码
前端·后端·github
bug菌14 小时前
🤔同事突然问我:Spring的注解 @Component 和 @Service 有何不同?
java·spring boot·后端
leobertlan14 小时前
痛苦系列 | DSP-02 频域切片:DTFT与DFT的探索
android·后端