程序员

值类型 VS 引用类型

2016-11-20  本文已影响166人  MoZhou

如果把系统比做是个银行,那么值类型相当于现金,要用直接用;引用类型是存折,要用时得先去银行取现。

值类型和引用类型都继承自System.Object类。不同之处是几乎所有的引用类型都是直接从System.Object继承,而值类型则是继承System.Object的子类System.ValueType类

1.什么是值类型?

直接存储数据,多用于存储不经常改变的值。数据存储在栈上,只存储变量的值。一般存储在栈上。所有的值类型都是seal的,不能被继承。

int i = 10;
int b = i;

CLR会先在栈上给i分配内存空间,然后把10存到这个空间里。然后在栈上给b分配内存空间,然后把i的值10copy 到分配给b的内存空间里。

2.值类型有哪些类别?

  • 简单类型 :有符号整型,无符号整型,字符类型,浮点类型,布尔类型
  • 枚举类型 :enum
  • 结构体类型 :struct

3.什么是引用类型?

存储数据的引用(内存地址),数据存储在堆中

A ref;//声明类
A a = new A()//实例化类

声明一个类时,CLR只会在栈中分配一小块内存用于存放地址,并没有为其分配堆上的内存空间。

new操作符返回对象的内存地址(即指向对象数据的内存地址)所以实例化一个类时,CLR会为实例分配堆上的空间,并且会把该实例堆上空间的地址保存到栈上为a分配的内存空间中。

4.引用类型有哪些类别?

  • 类类型 : string / class
  • 数组类型
  • 接口类型
  • 委托类型

5.为什么要有值类型?

为了用来存储基本的生命周期比较短不经常被改变的值数据,直接操作内存,查找起来比较方便,减小系统开销。

6.为什么要有引用类型?

存储得是对象的内存地址,需要先解析引用地址才能拿到对象。但是可以直接操作同一对象,不会像值类型一样每次都分配内存空间消耗内存。

7.生命周期什么时候结束?

  • 值类型 :离开函数体会被销毁
  • 引用类型 :没有被引用的地方时

8.GC什么时候回收?

当生命周期结束后,GC会统一回收

9.为什么值类型继承System.ValueType类却不是引用类型?

System.ValueType本身是一个引用类型,由于它重写了Equals()方法,所以对值类型按照实例的值来比较,而不是引用地址来比较。

上一篇 下一篇

猜你喜欢

热点阅读