如果把系统比做是个银行,那么值类型相当于现金,要用直接用;引用类型是存折,要用时得先去银行取现。
值类型和引用类型都继承自System.Object类。不同之处是几乎所有的引用类型都是直接从System.Object继承,而值类型则是继承System.Object的子类System.ValueType类
1.什么是值类型?
直接存储数据,多用于存储不经常改变的值。数据存储在栈上,只存储变量的值。一般存储在栈上。所有的值类型都是seal的,不能被继承。
int i = 10; int b = i;
CLR会先在栈上给i分配内存空间,然后把10存到这个空间里。然后在栈上给b分配内存空间,然后把i的值10
copy
到分配给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()方法,所以对值类型按照实例的值来比较,而不是引用地址来比较。
网友评论