您的位置:首页 > 编程语言 > C#

温故而知新(1)——C#类型转换

2017-02-13 14:43 134 查看
类型转换

所谓类型转换,就是把值从一个类型转换为另一个类型,比如int->string,datetime->string。

以下是《C#入门经典》中对类型转换的定义。(切忌不可按照自己的惯性思维误导,本人在复习前一直都认为显式是所有情况都可转换,隐式是特定情况才可转换,因为只顾使用而很少仔细学习阅读基本知识。)

这里类型转换有2种方式:

隐式转换:从类型A——>类型B的转换可在所有情况下进行,执行转换的规则非常简单,可以让编译器执行转换。

举例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Blog
{
class Program
{
static void Main(string[] args)
{
int a = 1;
double b = 1.5;//int转换成double
b = a;
Console.Write(b);

}
}
}


从代码中可以看到,不需要任何强制转换,int类型隐式的转换成了double类型。而如果反过来要让a=b,结果如图:



因为int可以自动上升为double,但由double不能自动转化为int,这里就需要显式转换,即int a = (double)b才是最保险的;所以显式转换肯定不会出错,但隐式转换就说不定了。

显式转换:从类型A——>类型B的转换只能在某些情况下进行,转换规则比较复杂,应进行某种类型的额外处理。

举例:

class Program
{
static void Main(string[] args)
{
int a = 1;
double b = 1.5;//int转换成double
//b = a;
//Console.Write(b);

a = (int)b;//double强制转换为int
Console.Write(a);

}
}


但是当我们试图把一个值转换为不兼容的变量时,需要注意转换过程中数据是否会溢出。这里我们需要在转换时使用“溢出检查上下文”,即checked和unchecked。

如果我们不用checked,效果如下:

static void Main(string[] args)
{
byte a;
short b = 299;
a = (byte)b;
//a = checked((byte)b);
Console.Write(a);
Console.ReadKey();
}




可见编译程序时并未报错,但是数据并不正确,我们分别看299,255,43的二进制:

299=100101011;

255=011111111;

43 =000101001;

如图可知,源数据的最左一位丢失导致数据转换错误。

加上checked后,效果如图:

static void Main(string[] args)
{
byte a;
short b = 299;
//a = (byte)b;
a = checked((byte)b);
Console.WriteLine("b="+b);
Console.WriteLine("a="+a);
Console.ReadKey();
}




编译器会报错:算术运算导致溢出!我们也可以通过相应配置改变溢出检查的默认配置,详细的请百度,这边就不做太多描述了。

不过目前我做过的项目都是用的.NET Framework中system命名空间自带的Convert()命令进行转换,使用这种方法总是要进行溢出检查,checked和unchecked关键字以及项目属性设置并不起作用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c#