【C#】-值类型和引用类型(未赋值的局部变量)
【引言】
这部分内容还是很重要的,那么是什么让我对值和引用类型着迷呢?
我们先来看一下例子:
这个是我们当时在讨论设计模式的时候看到的,你们可以想想,为什么会声明Null? 直接声明 Expression expression;不行吗?
如果直接声明 Expression expression;会出现什么情况?
就会出现未赋值的局部变量expression这个错误。 那么到底是怎么回事呢?那么我们先来了解一下值类型和引用类型吧。
【正文】
举个例子:
(1)值类型:
结果:
(2)引用类型
结果:
是不是感觉很惊讶? 其实他们两个的类型不一样,导致结果也是不一样的。int属于值类型,数组属于引用类型。
左边属于值类型,右边属于引用类型。
值类型可以直接Copy,引用类型在栈里面存的是地址,在堆里面存的值。
这就是上边例子的原因。
(3)那么值类型和引用类型有什么不同?
1)值的类型存在栈上,引用类型 栈存的是地址, 值存在堆上。
2)在C#中,值类型的变量直接存储数组,而引用类型的变量是对数据的引用。
3)引用类型和值类型相同的是,结构体可以实现接口。
4)引用类型可以包含null,值类型不能(可以将null赋值给值类型,如 Int? a = mull;);
5)值类型的变量赋值是直接Copy,而引用类型时赋值对对象的引用。
6)值类型不支持多态,引用类型支持多态。
(4)那么都有哪些是值类型,哪些是引用类型?
(5)C#中声明引用类型变量=null,在内存中意味着什么?
比如 A a = new A(); 就是在堆里面搞了一块符合A的空间嘛
如果A a = null ; 堆里面会产生什么呢,还是说只是栈里面多了个 a?
解答:
【终极】
(5)结果:
Expression expression=null ;
express= new Scale();
Expression 是一个引用类型, expression为引用变量, 它的目的是用来存在Expression实例的引用,一般地 expression 在栈中。而A 实例的对象在堆中。
Expression expression= null;
仅仅是将引用变量初始化为Null,并没有实例化Expreesion,所以堆中没有A的实例。