4.ref 和 out 的重载 #p#分页标题#e# ref和out关键字在运行时的处理方式不同

时间:2021-10-13 06:36:44

1.值类型和引用类型 

参考()

值类型和引用类型的使用范畴:

C#的值类型包孕:布局体(数值类型、bool型、用户界说的布局体),枚举,可空类型。
C#的引用类型包孕:数组,用户界说的类、接口、委托,object,字符串。

值类型和引用类型储存的方法:

C#中值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中。

//值类型直接向栈中储存具体数据,引用类型储存的是数据的引用,也就是数据存储在数据堆上的地点,也可以理解为标识。

值类型和引用类型的担任类:

引用类型和值类型都担任自System.Object类。差此外是,几乎所有的引用类型都直接从System.Object担任,

而值类型则担任其子类,即 直接担任System.ValueTypeSystem.ValueType直接派生于System.Object

C#的所有值类型均隐式派生自System.ValueType

值类型和引用类型的区别:

引用类型与值类型不异的是,布局体也可以实现接口;

引用类型可以派生出新的类型,而值类型不能;

引用类型可以包罗null值,值类型不能(可空类型成果允许将 null 赋给值类型);

引用类型变量的赋值只复制对东西的引用,而不复制东西自己。而将一个值类型变量赋给另一个值类型变量时,将复制包罗的值

2.堆和栈  

参考(

stackheap是两种内存分配的两个统称。

stackheap的第一个区别就是申请方法差别:stack是系统自动分配空间的,而heap则是措施员按照需要本身申请的空间。

每一个线程都有一个stack,但是每一个应用措施凡是都只有一个heap

stackheap回收方法的区别:

由于stack上的空间是自动分配自动回收的,所以stack上的数据的保留周期只是在函数的运行过程中,运行后就释放失,不成以再访谒。而heap上的数据只要措施员不释放空间,就一直可以访谒到,不过错误谬误是一旦忘记释放会造成内存泄露。

stackheap申请后系统的响应:

stack:只要stack的残剩空间大于所申请空间,系统将为措施供给内存,否则将报异常提示stack溢出。

heap:首先应该知道操纵系统有一个记录空闲内存地点的链表,当系统收到措施的申请时,会遍历该链表,寻找第一个空间大于所申请空间的heap

stackheap申请效率的对照:

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];