温故而知新(1)——C#类型转换
2017-02-13 14:43
134 查看
类型转换
所谓类型转换,就是把值从一个类型转换为另一个类型,比如int->string,datetime->string。
以下是《C#入门经典》中对类型转换的定义。(切忌不可按照自己的惯性思维误导,本人在复习前一直都认为显式是所有情况都可转换,隐式是特定情况才可转换,因为只顾使用而很少仔细学习阅读基本知识。)
这里类型转换有2种方式:
隐式转换:从类型A——>类型B的转换可在所有情况下进行,执行转换的规则非常简单,可以让编译器执行转换。
举例:
从代码中可以看到,不需要任何强制转换,int类型隐式的转换成了double类型。而如果反过来要让a=b,结果如图:
因为int可以自动上升为double,但由double不能自动转化为int,这里就需要显式转换,即int a = (double)b才是最保险的;所以显式转换肯定不会出错,但隐式转换就说不定了。
显式转换:从类型A——>类型B的转换只能在某些情况下进行,转换规则比较复杂,应进行某种类型的额外处理。
举例:
但是当我们试图把一个值转换为不兼容的变量时,需要注意转换过程中数据是否会溢出。这里我们需要在转换时使用“溢出检查上下文”,即checked和unchecked。
如果我们不用checked,效果如下:
可见编译程序时并未报错,但是数据并不正确,我们分别看299,255,43的二进制:
299=100101011;
255=011111111;
43 =000101001;
如图可知,源数据的最左一位丢失导致数据转换错误。
加上checked后,效果如图:
编译器会报错:算术运算导致溢出!我们也可以通过相应配置改变溢出检查的默认配置,详细的请百度,这边就不做太多描述了。
不过目前我做过的项目都是用的.NET Framework中system命名空间自带的Convert()命令进行转换,使用这种方法总是要进行溢出检查,checked和unchecked关键字以及项目属性设置并不起作用。
所谓类型转换,就是把值从一个类型转换为另一个类型,比如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#调用COM组件
- C#实现把指定数据写入串口
- C#动态创建button的方法
- C#使用第三方组件生成二维码汇总
- C#中抽象方法与虚拟方法的区别
- c#中虚函数的相关使用方法
- C#实现给图片加水印的方法
- C#使用加边法计算行列式的值
- C#实现多线程的同步方法实例分析
- C#中尾递归的使用、优化及编译器优化
- C#中的delegate委托类型基本学习教程
- C#实现子窗体与父窗体通信方法实例总结
- C#通用邮件发送类分享
- 举例讲解C#中自动实现的属性
- C#中this的用法集锦
- C#数据结构之顺序表(SeqList)实例详解
- C#.NET获取拨号连接的宽带连接方法
- C#网络适配器简单操作
- C#实现导出List数据到xml文件的方法【附demo源码下载】
- C#异步绑定数据实现方法