一、数据类型
(1)值类型
1、概念
值类型变量可以直接分配给它一个值。
值类型直接包含数据。系统分配内存来存储值。
eg:int、char、float、long
enum、struct
2、存储
值类型总是分配在它声明的地方。
做为局部变量时,存储在栈上;
做为类对象的字段时,则跟随此类存储在堆中。
(2)引用类型
1、概念
引用类型不包含存储在变量中的实际数据,但它们包含对变量的引用。
引用类型的值(对象)是引用类型的一个实例。
换句话说,它们指的是一个内存位置。
使用多个变量时,引用类型可以指向一个内存位置。
如果内存位置的数据是由一个变量改变的,其他变量会自动反映这种值的变化。
类、接口、数组都属于引用类型
eg:object、string、interface、int[]、Hashtable
delegate、class
2、存储
引用类型存储在堆中。
类型实例化的时候,会在堆中开辟一部分空间存储类的实例。
类对象的引用存储在栈中。
(3)区别
1、在给引用类型的变量赋值的时候,只是赋值了对象的引用。当我们使用引用类型时,实际上只是在处理该类型的指针。而非引用类型本身,
2、给值类型变量赋值的时候是创建了一个副本(克隆了一个变量)。使用值类型时是使用其本身。
1 Student s = new Student(); 2 s.age = 10; 3 Student s2 = s;//给引用类型的变量赋值的时候,其实只是赋值了对象的引用; 4 5 6 int a = 0; 7 int a2 = a;//给值类型变量赋值的时候是创建了一个副本
(3)指针类型
二、堆、栈
(1)概念
1、堆
在c里叫堆,在c#里叫托管堆。
托管堆不同于堆,它是由CLR(公共语言运行库(Common Language Runtime))管理。
当堆中满了之后,会自动清理堆中的垃圾。所以,做为.net开发,我们不需要关心内存释放的问题。
2、栈
是一种抽象数据结构,它拥有以下特性:
1)只能存堆栈的顶端存取数据数据;
2)满足"后进先出的原则"。
(其实就如同餐盘向餐桌上一个一个叠放,使用餐盘时需要从最顶端往下拿,这就是典型堆栈概念的应用)
(2)数据结构堆栈
1、堆
堆是无序的,是一片不连续的内存域,如果用户自己不释放的话,当内存达到一定的特定值时,通过垃圾回收器(GC)来回收。
2、栈
保持着先进后出的原则,是一片连续的内存域,有系统自动分配和维护。
(3)内存堆栈
存在内存中的两个存储区:
1、栈区:存放函数的参数、局部变量、返回数据等值,由编译器自动释放。
栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义。
2、堆区:存放着引用类型的对象,由CLR释放
堆是程序运行期间动态分配的内存空间,可以根据程序的运行情况确定要分配的堆内存的大小。
上文提及的栈(Stack),在程序运行的时候,每个线程(Thread)都会维护一个自己的专属线程堆栈。
当一个方法被调用的时候,主线程开始在所属程序集的元数据中,查找被调用方法。
然后通过JIT即时编译并把结果(一般是本地CPU指令)放在栈顶。
CPU通过总线从栈顶取指令,驱动程序以执行下去。
来源:
https://www.runoob.com/csharp/csharp-data-types.html
https://www.cnblogs.com/codingsilence/archive/2011/02/28/2146584.html