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

常见的值类型和引用类型
值类型:int 、float 、double 、struct(结构体)、enum(枚举)
引用类型:string、class、interface(接口)、array(数组)
在 C# 中,值类型和引用类型在内存分配、复制方式和生命周期管理等方面存在本质区别

1. 内存分配

  • 值类型:(栈)
值类型的变量直接存储其数据值,这些数据存储在 栈(Stack)上。栈是一种后进先出(LIFO, Last In First Out)的数据结构, 内存管理效率高。当声明一个 int类型的变量时,系统会在栈上分配足够的空间来存储该整数值。
  • 引用类型:(数据在堆上,栈上只有地址)
引用类型的变量数据在栈存储的是:对象在 堆(Heap)上的内存地址(引用),而不是对象本身。 堆是一个用于动态分配内存的区域,内存分配相对灵活,但管理也更复杂。当创建一个类的实例时,系统会在堆上分配内存来存储对象的数据,然后在栈上为该对象的引用变量分配空间,该空间存储的是堆上对象的地址。

2.赋值时

  • 值类型:(两个完全独立)
当对值类型变量进行赋值操作时,会进行值的复制。也就是说,新变量会得到一份原变量数据的完全独立副本。对其中一个变量的修改不会影响另一个变量。
  • 引用类型:(两个指向同一个对象)
当对引用类型变量进行赋值操作时,实际上是复制了对象的引用(内存地址),而不是对象本身。因此,两个变量指向的是堆上的同一个对象,对其中一个变量所引用对象的修改会影响另一个变量。

3.生命周期

  • 值类型:(没用了自动移除)
值类型的变量在其作用域结束时,会自动从栈上移除。因为栈的内存管理是由系统自动控制的,遵循后进先出原则,所以值类型变量的生命周期相对简单。
  • 引用类型:(立即回收机制)
引用类型的对象存储在堆上,其生命周期由垃圾回收器(Garbage Collector, GC)管理。当没有任何引用指向堆上的对象时,垃圾回收器会在适当的时候回收这些对象所占用的内存。这意味着即使一个引用类型变量超出了其作用域,如果还有其他引用指向该对象,对象仍然不会被立即回收。

4.默认值

  • 值类型:(有默认值)
值类型有预定义的默认值。例如,数值类型的默认值是 0,布尔类型的默认值是 false,字符类型的默认值是 \0(空字符)。当声明一个值类型变量而没有显式赋值时,它会被初始化为默认值。
  • 引用类型:(默认为null,空)
引用类型的默认值是 null,表示该变量不引用任何对象。当声明一个引用类型变量而没有使用 new关键字创建对象时,它的值为 null

你可能感兴趣的:(c#,学习,开发语言)