C#:二维三维图形绘制工程实例宝典
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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函数结束为止。局部变量的使用与实例变量相同。