值类型与引用类型的区别
基础扎实才能走的更远!
(一)值类型与引用类型区别
1、值类型:结构体(数值类型,bool型,用户定义的结构体),枚举,可空类型。
引用类型:数组,用户定义的类、接口、委托,object,字符串。
2、
值类型主要是在栈上分配空间(栈是先进先出,所以所有栈中元素必须从栈顶进,从栈顶出),引用类型主要是在堆中分配空间,而在栈中分配一个
2、
问 题 | 值 类 型 | 引 用 类 型 |
---|---|---|
这个类型分配在哪里? | 分配在栈上 | 分配在托管堆上 |
变量是怎么表示的? | 值类型变量是局部复制 | 引用类型变量指向被分配得实例所占的内存 |
基类型是什么? | 必须继承自System.ValueType | 可以继承自除了System.ValueType以外的任何类型,只要那个类型不是sealed的(继承自Object) |
这个类型能作为其他类型的基类吗? | 不能。值类型是密封的,不能被继承 | 是的。如果这个类型不是密封的,它可以作为其他类型的基类 |
默认的参数传递是什么? | 变量是按值传递的(也就是,一个变量的副本被传入被调用的函数) | 变量是按引用传递(例如,变量的地址传入被调用的函数) |
这个类型能重写System.Object.Finalize()吗? | 不能。值类型不好放在堆上,因此不需要被终结。 | 可以间接地重写 |
我可以为这个类型定义构造函数吗? | 是的,但是默认的构造函数被保留(也就是自定义构造函数必须全部带有参数) | 当然! |
这个类型的变量什么时候消亡? | 当它们越出定义的作用域时。 | 当托管堆被垃圾回收时。 |
值类型主要是在栈上分配空间(栈是先进先出,所以所有栈中元素必须从栈顶进,从栈顶出),引用类型主要是在堆中分配空间,而在栈中分配一个
指向对象实例的引用指针。
MSDN的一张图