C# 学习笔记 8.深入理解类型

1.类型分类 值类型和引用类型

值类型-简单的类型,枚举类型,结构体类型。通常分配在栈上。

引用类型-类类型,接口类型,委托类型,字符串等。分配在堆上,变量保存的是实例数据的地址。

 

2.值类型和引用类型的区别

1.值类型中嵌套定义引用类型,栈上保存该引用类型的引用,而实际数据仍保存在托管堆中。

2.引用类型中嵌套值类型 ,如果字段值是值类型,它将作为引用实例的一部分,分配到堆上。

作为局部变量,则分配到栈上。

3.值类型继承ValueType,ValueType又继承自System.Object,而引用类型直接继承于system.Object.

4.值类型不手GC(垃圾回收器 Grabage collection)控制。作用域结束就可会释放。

5.若值类型是密封的(sealed),你不能把值类型作为其它任何类型的基类,密封类型无法被继承。

引用类型一般具有继承性,这里及类和接口。(这里有疑问,应该说的类中的值类型和类中引用类型,待测试。)

6.值类型默认初始为0,引用类型默认情况下会初始化为null。对值为null的类型操作会引发异常。

7.引用类型传递后,如果值改变会影响到引用类型变量的值。

3.两大类型之间的转化 装箱和拆箱

1.类型转化的几种方式。

1).隐式类型转换。 由低级别的类型向高级别的类型转换。例如,派生类可以隐式转换为它的父类。

装箱过程就属于这种隐士类型转换。

2).显示类型转换。也叫强制类型转换。但是这种转化可能会导致精度损失或者出现运行时异常。

(type)变量名或函数。和c++ 11前的强制类型转换一样。

3).通过is 和as运算符进行安全的类型转换。

4).通过.net类库种的convert类来完成类型转换。

2.装箱拆箱

装箱是指把值类型转化为引用类型。拆箱反之。

装箱的过程种,系统会在托管的堆中生成一份堆栈中值类型对象的副本。

拆箱则是从托管的堆栈中将引用类型指向的已装箱数据复制回值类型对象的过程。

尽量避免装箱和拆箱操作,最好使用泛型来编程。

4.参数传递问题的剖析

1.值类型按值传递。

实际传递的是该值类型的副本。

2.引用类型按值传递。

直接传递是的地址的副本。

3.string 引用类型参数按值传递的特殊情况。

string具有不变性。

4.值类型和引用类型按引用传递

可以使用ref或者out关键字来实现参数的按引用传递。

string 按照引用传递,string的地址值会发生改变。

托管堆上的东西其实还是没有发生改变。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值