1.1.6 类型转换
在编写C#程序过程中,经常会碰到类型转换问题。例如,将整数类型数据和浮点类型数据相加,C#会进行隐式转换。
C#中类型转换分为:隐式转换(implicit conversion)、显式转换(explicit conversion)和用户自定义转换(user-defined conversion)。
1.隐式转换
在函数成员调用、强制转换表达式和赋值等情况下,都会发生隐式转换。隐式转换是系统默认的、自动进行的转换。预定义的隐式转换总会成功地进行,并且不会造成信息的丢失。
隐式转换包括:标识转换、隐式数值转换、隐式枚举转换、装箱转换、隐式常数表达式转换和用户定义的隐式转换。例如:
int a=100; // 隐式数值转换 float b=a; enum WeekDay{ Sun , Mon , Tue , Wed , Thu , Fri , Sat } WeekDay days=0; // 隐式枚举转换
隐式数值转换实际上是按照如图1-1所示顺序从低精度的数值类型到高精度数值类型的转换。
图1-1 隐式数值转换顺序
例如:
int a=100; float b=a;
注意
从int、uint、long或ulong到float,以及从long或ulong到double的转换可能导致精度损失,但决不会影响大小。
隐式枚举转换允许十进制数0转换成任何枚举类型,其他类型不存在这种转换。如:
enum WeekDay{ Sun , Mon , Tue , Wed , Thu , Fri , Sat } WeekDay days; Days=0; // 将0转换为Sun
2.显式转换
显式转换是一种强制转换,它需要指明转换的类型,但这种转换不能保证总是成功。显式转换集包含所有的隐式转换。显式转换包括:显式数值转换、显式枚举转换、显式引用转换、取消装箱转换和用户自定义的显式转换。以下是一些显式转换例子:
enum Range : long{ Max=2147483648L , Min=255 } int a=65; short b=(short)a; // 显式数值转换 char c=(short)c; // 显式数值转换 Range d=(Range)a; // 显式枚举转换
3.装箱和取消装箱
装箱和取消装箱的概念是C#类型系统的核心,它可以完成值类型和引用类型之间的转换,它使值类型能够被视为对象。
装箱转换允许将值类型隐式转换为引用类型。实际上装箱的工作过程是:首先分配一个对象实例,然后将值类型的值拷贝到该实例中。
取消装箱转换允许将引用类型显式转换为值类型。取消装箱也包括两个步骤:首先检查对象实例是否为给定值类型一个装了箱的值,然后将该值从实例中拷贝出来。
装箱和取消装箱的例子如下:
int a , b=1000; object x=b; // 装箱 a=(int)x; // 取消装箱 Console.WriteLine(1000.ToString()); // 将值类型视为对象,使用object的ToString成员
4.变量
其值可以改变的量为变量。每个变量都具有一个类型,它确定哪些值可以存储在该变量中。在C#中,变量必须先定义后使用。
C#有7种变量类别,分别是:静态变量、实例变量、数组元素、局部变量、值参数、引用参数和输出参数。
(1)静态变量和实例变量
用static修饰符声明的字段(字段是一个与类或结构体相关的变量,或者是与类或结构体实例相关的变量)称为静态变量,未用static修饰符声明的字段称为实例变量。静态变量不属于某个特定的实例,不管创建了多少个类实例,在任何时候静态变量都只会有一个副本。实例变量属于某个特定的实例,即类的每个实例都包含该类的实例变量的一个副本。例如:
class TestVarition { public static long x=10; public int y; public decimal z; int[] arr=new int[2]; void Local() { int a=1, b; } } class Test { stotic void Main() { TestVarition var=new TestVarition(); var.z=100.34m; Console.WriteLine("{0}",TestVarition.x); } }
表明TestVarition类具有一个公有静态变量x、两个公有实例变量y和z、两个局部变量a和b、两个数组元素arr[0]和arr[1]。
从例子可以看出,静态变量的使用格式为
类名. 静态变量名
实例变量的使用格式为
类实例名. 实例变量名
(2)数组元素
数组的元素在创建数组实例时开始存在,在没有对该数组实例的引用时停止存在。每个数组元素的初始值都是其数组元素类型的默认值。数组元素的使用与实例变量相同。
(3)局部变量
在块、语句、语句、语句和函数中声明的变量称为局部变量,它只有局部作用域,只在该范围内有效。当程序运行到这一范围时,它才起作用,程序离开时就失效。如上例中的局部变量a和b,它们的作用范围为从声明开始,一直到Local函数结束为止。局部变量的使用与实例变量相同。