c#中值类型和引用类型的区别

沈威的博客 / 2024-10-21 / 原文

前言:
  最近单位活不多,威某人就把摸鱼的时间奉献出来吧,接下来开始我们惊心动魄且异常艰难的c#基础篇,坐稳了吗同学们,让我们进入第一章节“值类型于引用类型的区别”

1.值类型和引用类型有哪些:

  •   值类型包括基本数据类型(如:int,float,bool),结构体(如:struct),枚举(enumrations).
  •   引用类型包括类(classes),接口(interfaces),委托(delegates),数组(arrays)等

2.重点:

  •   值类型和引用类型的区别主要体现于内存中的存储方式,赋值传递行为,默认值以及生命周期

2.1.存储方式:

  • 值类型储存在栈上,引用类型储存在堆上

2.2.赋值传递行为:

  •   值类型赋值给另一个变量时,会创建一个属于他们两的一个副本,而引用类型赋值给另一个变量时则会复制引用地址指向同一个对象

2.3.默认值:

  • 值类型通常都会有属于自己的默认值例如int默认值是0,bool默认值是false,引用类型的默认值是null,说明引用类型在初始化阶段时没有指向任何的对象

2.4.生命周期:

  •   值类型的生命周期主要取决于它所在的代码块或者说时方法中,其实这里也可以说取决于它所在的作用域中,例如一个值类型的变量在一个方法中,当这个方法被调用完后其占用的内存会被迅速回收
  •   引用类型的生命周期由垃圾回收器(GC)管理,当没有引用指向他们时,GC会将它回收

  总结就是:值类型的生命周期相对简单和短暂,与它们所在的作用域直接相关;而引用类型的生命周期取决于是否有引用指向它们,并且由垃圾回收器来管理其内存的回收。
3.扩展:

3.1.可变性和不可变性:

  •   值类型是不可变的,因为每次操作都会创建一个副本
  •   引用类型是可变的,因为修改的是对象本身,所有指向该对象引用的都可以看到相应的修改

3.2.性能和开销:

  •   由于值类型存在于栈中,所以它们的分配和读取的开销相对来说比较小比较快,而引用类型存储于堆上并且涉及垃圾回收机制,因此可能会有更高的开销
  •   另一方面如果值类型很大,复制开销可能会比引用类型更高

3.3.装箱和拆箱:

  •   值类型可以隐式转换为引用类型,我们称这个为装箱,例如,int转换为object
  •   拆箱则是将装箱的值类型转换回来,需要注意的是频繁的装箱和拆箱会导致性能损耗,因此要合理使用

结尾:
  值类型和引用类型是我们在学习和实践c#中绝不可避免的部分,希望本章内容对你会有所帮助,当然如果有不懂或者不同见解的小伙伴也可以在评论区打出你的想法,互相讨论互相学习~