1.值类型和引用类型
参考()
值类型和引用类型的使用范畴:
C#的值类型包孕:布局体(数值类型、bool型、用户界说的布局体),枚举,可空类型。
C#的引用类型包孕:数组,用户界说的类、接口、委托,object,字符串。
值类型和引用类型储存的方法:
在C#中值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中。
//值类型直接向栈中储存具体数据,引用类型储存的是数据的引用,也就是数据存储在数据堆上的地点,也可以理解为标识。
值类型和引用类型的担任类:
引用类型和值类型都担任自System.Object类。差此外是,几乎所有的引用类型都直接从System.Object担任,
而值类型则担任其子类,即 直接担任System.ValueType。System.ValueType直接派生于System.Object。
C#的所有值类型均隐式派生自System.ValueType;
值类型和引用类型的区别:
引用类型与值类型不异的是,布局体也可以实现接口;
引用类型可以派生出新的类型,而值类型不能;
引用类型可以包罗null值,值类型不能(可空类型成果允许将 null 赋给值类型);
引用类型变量的赋值只复制对东西的引用,而不复制东西自己。而将一个值类型变量赋给另一个值类型变量时,将复制包罗的值
2.堆和栈
参考()
stack和heap是两种内存分配的两个统称。
stack和heap的第一个区别就是申请方法差别:stack是系统自动分配空间的,而heap则是措施员按照需要本身申请的空间。
每一个线程都有一个stack,但是每一个应用措施凡是都只有一个heap
stack和heap回收方法的区别:
由于stack上的空间是自动分配自动回收的,所以stack上的数据的保留周期只是在函数的运行过程中,运行后就释放失,不成以再访谒。而heap上的数据只要措施员不释放空间,就一直可以访谒到,不过错误谬误是一旦忘记释放会造成内存泄露。
stack和heap申请后系统的响应:
stack:只要stack的残剩空间大于所申请空间,系统将为措施供给内存,否则将报异常提示stack溢出。
heap:首先应该知道操纵系统有一个记录空闲内存地点的链表,当系统收到措施的申请时,会遍历该链表,寻找第一个空间大于所申请空间的heap。
stack和heap申请效率的对照:
stack:由系统自动分配,速度较快。但措施员是无法控制的。
heap:是由new分配的内存,一般速度对照慢,而且容易孕育产生内存碎片,不过用起来最便利。
总结:1.在创建stack的时候,stack的巨细就固定了,因为stack需要持续占用一段时间。
而heap的巨细是动态的,其分配和释放也是动态的。
2.如果stack的数据过多,就会爆栈,而heap如果也爆了,就说明内存也一起爆了。
3.每个函数的stack都是相对独立的,但是一个应用措施的heap是被所有stack所共享的。
特殊案例:
考虑数组:
int[] reference = new int[100];
按照界说,数组都是引用类型,所以int数组固然是引用类型(即reference.GetType().IsValueType为false)。
而int数组的元素都是int,按照界说,int是值类型(即reference[i].GetType().IsValueType为true)。那么引用类型数组中的值类型元素究竟位于栈还是堆?
如果用WinDbg去看reference[i]在内存中的具体位置,就会发明它们并不在栈上,而是在托管堆上。
实际上,对付数组:
TestType[] testTypes = new TestType[100];