一、【堆和栈】
介绍值参数和引用参数前,先介绍堆和栈的概念。
堆和栈是指运行程序时,使用的存储数据的两个内存区域。
栈是一个内存数组,遵循LIFO(后进先出)的数据结构,栈一般存储如下数据:
- 某些类型变量的值;
- 程序当前的执行环境
- 传递给方法的参数
栈的示意图如下:
堆也是一块内存区域,它相当于栈很大,一般用于存储大型数据,堆内数据能以任意顺序存入和删除。
堆的示意图如下:
二、【值类型和引用类型】
值类型:存储在栈上;
引用类型:类似于C++的指针,引用存储在栈上,实际数据存储在堆上。
需要注意的问题:
1.对于值类型,它也有可能在堆上。如在类中(引用类型)定义了值类型,那么在类实例中,
该值类型数据,还是在堆中,如下图(MyType类中定义了一个值类型A):
2. 值类型都是struct,都继承于System.ValueType类,CLR对System.ValueType的派生类做了特殊处理,如使它内存分配方面具有值类型的特征,使其不能被继承(私有)等。
C#的值类型和引用类型分类如下图:
三、值参数和引用参数
值参数:在方法调用时,在栈上先为形参分配空间,然后将实参的值复制给形参。
引用参数:类似于C++的引用,在方法调用的时候,不会在内存中分配空间,只会为实参分配一个别名。
需要注意的是:
引用参数声明和调用时必须都使用ref
引用参数的实参必须是变量,且用做实参时必须被赋值(防止未被赋值时,报错,相对于C++的改进)