当前位置: 首页 > article >正文

C#-值类型、引用类型

一:值类型、引用类型

1.1 值类型

整型、浮点、bool、char、枚举、结构体

仅需一段内存来存储实际的数据、单独定义时放在栈上

1.2 引用类型

string、数组、类(自定义类、内置的类)

需2段内存

  1. 存放实际数据、位于堆中(因为占得位置比较大)

  2. 存放引用,指向数据在堆中的位置(保存地址)

二:值类型和引用类型的区别

2.1 使用上的区别

值类型:在相互赋值时,把内容拷贝给了对方,它变我不变

引用类型:在相互赋值时,让两者指向同一个值,它变我也变

2.2 为什么有以上区别

两者所存储的内存区域及存储方式不同

值: 栈 → 系统分配,自动回收,小而快

引用:堆 → 手动申请和释放,大而慢

在使用引用类型赋值时,赋值的是引用类型的引用,即地址

值类型数组,数组中直接存储值

引用类型数组,数组中存储的是引用(内存地址)

 new 了 就是在堆中开了新空间,和之前的,没有什么关系了

三:string是特殊引用类型

string是引用类型,但它具备,值类型的特征→它变我不变

string缺点:频繁改变string,会重新赋值,会产生 内存垃圾。

string型数据在赋值时,原数据不变。因为string在赋值时会在堆中重新分配内存空间,并修改栈中存储的地址

3.1 string使用上的缺点
  • 修改会导致频繁的内存分配和垃圾收集

  • 内存分配:每次使用 + 运算符或 Concat 方法连接字符串时,都会分配内存以创建一个新的字符串对象。在循环中进行字符串连接会导致性能问题。

  • 性能开销:对于需要频繁修改字符串内容的场景,使用 string 可能导致不必要的性能开销。例如,在构建一个由多个部分组成的字符串时,每部分的添加都涉及创建一个新对象。

  • 不支持缓冲区操作:string 类型不支持直接操作字符缓冲区,这在需要处理大量文本数据时可能不够高效。

  • 隐式装箱:由于 string 是引用类型,当它被赋值给一个 object 类型变量时,会发生装箱操作,这可能会增加额外的性能开销。

  • 安全性:不可变的 string 对象可以提高安全性,因为它们不能被意外修改。然而,在某些情况下,这可能限制了对字符串的直接操作。

  • 国际化和格式化:在处理国际化应用程序时,string 类型可能不足以处理复杂的文本格式化和文化差异。

  • 编码问题:在处理非ASCII字符时,string 类型默认使用 UTF-16 编码,这在处理大量非ASCII文本时可能导致内存使用增加。

3.2 string的优化替代方案
  1. StringBuilder:频繁的字符串修改或连接操作

  2. 处理大量数据,考虑使用 Span<T>ReadOnlySpan<T> 来避免不必要的内存分配。

  3. 使用 string.IsNullOrEmptystring.IsNullOrWhiteSpace: 在检查空字符串时,使用 string.IsNullOrEmptystring.IsNullOrWhiteSpace 而不是 == null== "" 可以避免不必要的字符串创建。


http://www.kler.cn/a/377019.html

相关文章:

  • HTML5 动画效果:淡入淡出(Fade In/Out)详解
  • Oracle 中的各种名称(*_name)参数的含义与作用
  • xxl-job回调执行器,发生NPE空指针异常
  • 探索大型语言模型新架构:从 MoE 到 MoA
  • maven如何从外部导包
  • Three.js - 打开Web 3D世界的大门
  • ctfshow web文件上传 web166-170
  • elementUI table 多级表头隔行变背景颜色
  • 从零开始构建 ChatGPT
  • 2024 Rust现代实用教程 Trait特质
  • 15分钟学 Go 第 27 天:路由和处理请求
  • 实际案例说明用基于FPGA的原型来测试、验证和确认IP——如何做到鱼与熊掌兼得?
  • vue 禁用element-ui calendar 取消非本月日期的点击事件
  • 【大模型LLM面试合集】大语言模型架构_tokenize分词
  • Maven详解—(详解Maven,包括Maven依赖管理以及声明周期,Maven仓库、idea集成Maven)
  • 基于Spring Boot和Vue的电子商城系统功能设计
  • Java面向对象的理解
  • 【JavaSE】java对象的比较
  • Linux:防火墙和selinux对服务的影响
  • Electron+Vue3+TS+sqlite3项目搭建加入sqlite3后无法运行问题
  • 沈阳乐晟睿浩科技有限公司抖音小店短视频时代的电商蓝海
  • ctfshow web入门文件上传总结
  • 【ShuQiHere】使用链表 (Linked List) 和数组 (Array) 实现栈 (Stack) 的深入解析与比较
  • 2. Flink快速上手
  • Web3中的数据主权:区块链如何为用户赋能
  • Java-02