【C#】-值类型和引用类型(未赋值的局部变量)

【引言】

这部分内容还是很重要的,那么是什么让我对值和引用类型着迷呢?

我们先来看一下例子:

【C#】-值类型和引用类型(未赋值的局部变量)

这个是我们当时在讨论设计模式的时候看到的,你们可以想想,为什么会声明Null? 直接声明 Expression expression;不行吗?

如果直接声明  Expression expression;会出现什么情况?

【C#】-值类型和引用类型(未赋值的局部变量)

【C#】-值类型和引用类型(未赋值的局部变量)

就会出现未赋值的局部变量expression这个错误。 那么到底是怎么回事呢?那么我们先来了解一下值类型和引用类型吧

【正文】

举个例子:

(1)值类型:

【C#】-值类型和引用类型(未赋值的局部变量)

结果:

【C#】-值类型和引用类型(未赋值的局部变量)

(2)引用类型

【C#】-值类型和引用类型(未赋值的局部变量)

结果:

【C#】-值类型和引用类型(未赋值的局部变量)

是不是感觉很惊讶? 其实他们两个的类型不一样,导致结果也是不一样的。int属于值类型,数组属于引用类型。

【C#】-值类型和引用类型(未赋值的局部变量)

左边属于值类型,右边属于引用类型。

值类型可以直接Copy,引用类型在栈里面存的是地址,在堆里面存的值。

这就是上边例子的原因。

(3)那么值类型和引用类型有什么不同?

1)值的类型存在栈上,引用类型 栈存的是地址, 值存在堆上。

2)在C#中,值类型的变量直接存储数组,而引用类型的变量是对数据的引用。

3)引用类型和值类型相同的是,结构体可以实现接口。

4)引用类型可以包含null,值类型不能(可以将null赋值给值类型,如 Int? a = mull;);

5)值类型的变量赋值是直接Copy,而引用类型时赋值对对象的引用。

6)值类型不支持多态,引用类型支持多态。

(4)那么都有哪些是值类型,哪些是引用类型?

【C#】-值类型和引用类型(未赋值的局部变量)

(5)C#中声明引用类型变量=null,在内存中意味着什么?

比如 A a = new A(); 就是在堆里面搞了一块符合A的空间嘛

如果A a = null ; 堆里面会产生什么呢,还是说只是栈里面多了个 a?

解答:

【C#】-值类型和引用类型(未赋值的局部变量)

 

【终极】

(5)结果:

 Expression expression=null ;

express= new Scale();

Expression 是一个引用类型, expression为引用变量, 它的目的是用来存在Expression实例的引用,一般地 expression 在栈中。而A 实例的对象在堆中。

Expression expression= null;

仅仅是将引用变量初始化为Null,并没有实例化Expreesion,所以堆中没有A的实例。