2018-7-20-随笔-转换

转换:

1.转换只是把源值作为目标类型使用而已,被没有改变,源值还是不变的。换个类型使用而已

2.在“隐式转换”中,对于无符号的类型有个“零扩展”,就是没有的位置用0来填充。 还有一个就是“符号扩展”,这是对有符号的类型,正数用0,负数用1填充。一般都是从右边开始对齐,左边不够的位数填充,多余的就会被丢失的。

3.在数据可能会丢失的情况下,系统不会自动的转换的,这是只能是“显式转换”---强制转换,在使用这个时候,就默认你会承担丢失数据的风险了。


转换的类型:1.预定义:数字(隐式、显式),装箱、拆箱,引用(显式、隐式)

      2.用户自定义(隐式、显式)


在数字转换中:整型-->整型、整型-->浮点型、整型-->decimal--------这些是隐式转换,其余的都是显式转换  无符号转换为有符号的都是隐式转换,切记char算是无符号-ushort

4.溢出检测上下文:checked(关系式)、unchecked(关系式),前者可检测是否溢出并在溢出是抛出异常(CLR抛出),后者不会抛出异常,不管溢出-------他们不仅可以实现对单表达式的检测,还可以对一个代码块进行检测,并且还是对代码块中的每一步转换进行检测。

5.在数字的显式转换中,很多都有溢出的可能,所以用checked或者unchecked进行检测,不是一定的溢出,如果在对应的范围内,不会出现溢出现象的。

6.引用转换:1).隐式转换:所有的引用类型都可以转换为object类型,任何类型都可以转换到它继承的接口,类可以转换为继承的类和实现的接口  是一种具体到抽象的过程----理解

      2).显示转换:object都可以转换为任何的引用类型,基类可以转换为继承它的类。一个普通类转成更精确的类  如果不受限制可以转换任何类,就会出现异常。

例如:类A,派生类B,A对象显示的转换成B对象,这样的转换是无效的,编译不错,但是会运行异常的。

      3).有效的显示转换:显示转换没必要、源引用是null、源引用被安全的隐式转换过。

7.装箱转换:是一种隐式转换,把一个类型,包括值类型,转换成引用类型(object)装箱只是创建一个副本,源值和副本可以分开的操作,互不影响。要想转换成接口,要先实现

8.拆箱转换:是一种显式转换,要把系统的值转换为原始类型,否则就会抛出异常       显式的转换----用的就是强制转换

9.用户自定义转换:只可以对类和结构进行自定义转换,不能重定义标准转换,两个类型不能有继承关系,不能是接口,不能是object类型,转换符合必须是类的成员。

理解:用户的自定义转换,就是一个类或者结构,转换成一个常见的类型--值类型(只是说一种常见的),两者的关系要有,在类中要有和值类型相似的成员,这样才可以转换成功。因为要返回的都是对应类型的数据。在用显式转换时候,要注意用强制转换才能进行转换成功。

模板:public static implicit/explicit operator (要转换的类型)(源类型  参数)

{

return : 和要转换的类型一样的数据;

}

10.用户自定义转换的评估:标准---自定义--标准  如果有个子类到父类是标准,int 到 float是标准,在父类中有转换,所以子可以转换成 float 三步都有!!!

11.is 运算符只可以用 引用转换以及装箱、拆箱转换,返回的是bool类型值,判断是否可以转换,然后再操作。

12.as运算符只能用在引用转换和装箱转换, 返回的都是引用类型------类引用,接口引用、结构等....

 

posted @ 2018-07-20 17:26  IT苦行僧-QF  阅读(125)  评论(0编辑  收藏  举报