C#系列三《C#数据类型与变量三》

    了解了数据类型与变量的基本概念之后,我们来讨论数据类型的转换与装箱与拆箱!

 

一 数据类型转换

      在编程时 我们有时候会遇到将一个类型的变量转换成另一种数据类型,我们称它为数据类型的转换,C#数据类型的转换有两种方式如下:

     1.默认安全的数据类型转换

      默认安全的数据类型转换:我们称之为 隐式的数据类型转换,什么是隐式的数据类型转换?隐式的数据类型转换就是数据类型的低范围(参考C#数据类型与变量一中的数据类型的范围)向高范围的数据类型的转换。例如:

    

1             int  a  =   200 // int 范围是 -2147483648~2147483647 
2               long  b  =  a;   // long 范围是 -9223372036854775808~9223372036854775807 表示的整数范围更大 并且这个范围包含200
3               // 所以我们认为这两个数据类型转换是默认合法的也称隐式数据类型转换
4              Console.WriteLine( " b =  " + b.ToString());

 运行结果当时会输出:“b = 200”这段话啦。。

 

     2.强制的数据类型转换

      了解隐式数据类型的转换后,我们在来了解下强制的类型转换,强制类型转换就是,当不满足隐式数据类型转换的规则时,的一种数据类型转换的方法,强制数据类型转换必然会引发一些错误,例如:

      将高范围数据类型(简称高)转换低范围数据类型(简称低)时,那么当“高”变量的值,超出了“低”数据类型的范围时,我们简称数据类型溢出。代码如下:

 

1             long  a  =   3333333333 // long 范围是 -9223372036854775808~9223372036854775807 ->3333333333在这个范围中合法
2               int  b  =  ( int )a;   // int 范围是 -2147483648~2147483647  -> 3333333333 超出了这个范围 所以导致数据类型溢出
3              Console.WriteLine( " a = "   +  a.ToString());
4              Console.WriteLine( " b = " + b.ToString()); // 类型溢出这里会输出一个非常大的负数

输出结果如下:

二 装箱与拆箱

     理解完基本数据类型的转换后我们来看一下值类型与引用类型之间的转换,我们称为装箱与拆箱。

     1.装箱

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

int  a  =   10 ;
object  obj  =  a;  // 将值类型转换引用类型,装箱操作

    在装箱操作时,运行时会在托管堆上分配一个空间,存放a 中的10,并标志这块空间的装箱类型是int。

    如图:

     2.拆箱

     那拆箱就跟装箱相反,就是将引用类型还原会值类型。   

int  a  =   10 ;
object  obj  =  a;  //将值类型转换引用类型 装箱
int  b  =  ( int )obj;  //将引用类型转换为值类型 拆箱

     当拆箱时我们会将推中的10强制类型转换放到栈空间中(图中代表int b)。

    如图:

     3.装箱与拆箱的作用

      当我需要显示的方法,分别来显示 int float double类型的值到控制台。一般我们的设计方法如下:    

 

class  MyProgram
{
    
// 用来打印int类型的值
     public   static   void  ShowInt( int  a)
    {
       Console.WriteLine(
"  a = " + a.ToString());
    }

    
// 用来打印float类型的值
     public   static   void  ShowFloat( float  a)
    {
       Console.WriteLine(
"  a = " + a.ToString());
    }

    
// 用来打印double类型的值
     public   static   void  ShowDouble( double  a)
    {
       Console.WriteLine(
"  a = " + a.ToString());
    }

    
static   void  Main( string [] args)
    {
        
int  a  =   10 ;
        ShowInt(a);
 
        
float  b  =   2.2 ;
        ShowFloat(b);

        
double  c  =   2.22 ;
        ShowDouble(c);
    }
}

那么我们思考一下,这个时候我需要在支持 string , short,char等等的类型显示的时候,我们是不是需要对每一个类型都定义一个显示的方法? 此时我们在看看引入了装箱与拆箱概念的方法设计: 

class  MyProgram
{
   
// 将参数类型改为object
     public   static   void  ShowObject( object  obj)
    {
       Console.WriteLine(
" obj = " + obj.ToString());
    }


    
static   void  Main( string [] args)
    {
        
int  a  =   10 ;
        ShowObject(a); 
// int a 被装箱
 
        
float  b  =   2.2 ; // float b 被装箱
        ShowObject(b);

        
double  c  =   2.22 ; // double c 被装箱
        ShowObject(c);
    }
}

 

这样我们将来不管需要扩展多少数据类型我们这个方法都可以满足。

 

 OK 数据类型与变量部分结束。下一篇介绍一下 C#的运算符。

转载于:https://www.cnblogs.com/doubleliang/archive/2011/05/11/2043721.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值