C# 之类型转换

一、常用类型概述:

bool -> System.Boolean (布尔型,其值为 true 或者 false)
char -> System.Char (字符型,占有两个字节,表示 1 个 Unicode 字符)
byte -> System.Byte (字节型,占 1 字节,表示 8 位正整数,范围 0 ~ 255)
sbyte -> System.SByte (带符号字节型,占 1 字节,表示 8 位整数,范围 -128 ~ 127)
ushort -> System.UInt16 (无符号短整型,占 2 字节,表示 16 位正整数,范围 0 ~ 65,535)
uint -> System.UInt32 (无符号整型,占 4 字节,表示 32 位正整数,范围 0 ~ 4,294,967,295)
ulong -> System.UInt64 (无符号长整型,占 8 字节,表示 64 位正整数,范围 0 ~ 大约 10 的 20 次方)
short -> System.Int16 (短整型,占 2 字节,表示 16 位整数,范围 -32,768 ~ 32,767)
int -> System.Int32 (整型,占 4 字节,表示 32 位整数,范围 -2,147,483,648 到 2,147,483,647)
long -> System.Int64 (长整型,占 8 字节,表示 64 位整数,范围大约 -(10 的 19) 次方 到 10 的 19 次方)
float -> System.Single (单精度浮点型,占 4 个字节)
double -> System.Double (双精度浮点型,占 8 个字节)

值类型和引用类型讲解请看另一篇http://www.cnblogs.com/Liyuting/p/6699536.html

二、显式转换与隐式转换:

隐式转换:隐式转换不需要在代码中指定转换类型;如:

int intNumber = 10; 
double doubleNumber = intNumber;  
long a = intNumber; //

显式转换:显式转换则相反,需要指定转换类型;如:

double doubleNumber1 = 10.1;  
int intNumber1 = (int)doubleNumber1; //

对于表示数值的基本数据类型来说,数值范围小的数据类型转换成数值范围大的数据类型可以进行隐式转换,而反过来则必须进行显示转换。就像上面的两个例子一样。 对于类类型来说,子类转换成父类可以进行隐式转换,而反过来则必须进行显式转换,例如:string str1 = "abc";object obj = str1;  //子类转换成父类,隐式转换string str2 = (string)obj;  //父类转换成子类,显式转换 如果两个类之间没有继承关系,则不能进行隐式转换或显式转换,此时必须在被转换的类中定义一个隐式转换方法或显式转换方法。

显式转换要求是同类型的,就是说两种数据类型必须兼容,隐式转换是向上转型(相当是子类转父类),而强制类型转换则是向下转型(相当是父类转子类),就好像Double型的可以包含int型一样。而强制转换可以是不是同一种类型,(如同class1与class2同级别的类一样),两都进行内容上的解析。Convert.ToInt32与int.Parse都是强制转换,int.Parse是转换String为int(这种情况很多,可能进行了些优化,也可能只是为了方便,处理逻辑一样), 而Convert.ToInt32是转换继承自Object的对象为int的(18种重载). 比如一个object对象,你想把它转换为int,用int.Parse就不可以,要用Convert.ToInt32。

三、装箱与拆箱:

装箱:将值类型转换成引用类型。

拆箱:将引用类型转换为值类型。

四、IS与AS:

1、使用场景:

  强制类型转换,有可能会导致异常。is与as就是为了解决这一问题,is与as永远不会抛出异常。

2、is判断一个对象是否兼容于指定的类型,考虑里氏代换。Dog是Animal,而Animal不是Dog。

3、as 与强制类型转换一样,区别是使用as是安全的。使用as如果转换失败,返回Null,不会抛出异常。

4、使用is和as可以取代强制类型转换,分别如下: 

a、IS只是做类型兼容判断,并不执行真正的类型转换。返回true或false,不会返回null,对象为null也会返回false。is操作符永远不会抛出异常。
  if(a is Dog)
  {
    Dog d = (Dog)a;
    ...
boolean b1=(obj is Object); //b1 为true   } b、AS操作符类似于强制转换,但又有区别,当对象为null时,不会抛异常而是会返回null。   Dog d
= a as Dog;   if(d!=null)   {     ...
Class1 b = o as Class1; // b = null
 }

注意:二者效果一样,但是效率差别很大,使用is会检查两次对象的类型,一次是核实,一次是强制转换。使用as只进行了一次对象类型的检查。检查对象的类型,是个耗费资源的操作,首先要判断对象的实际类型,然后必须遍历继承树结构(层次结构),去与每个基类核对。

 

posted @ 2017-04-21 10:36 孤者自清 阅读(...) 评论(...) 编辑 收藏