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

类型转换

所谓类型转换,就是把值从一个类型转换为另一个类型,比如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,结果如图:
double转换为int报错
因为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关键字以及项目属性设置并不起作用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值