“无论是什么类型,所有的数据都是一系列的位,即一系列0和1。变量的含义是通过解释这些数据的方式来传达的。”——这句原话是书上翻译的,不过后一句话总感觉理解起来不是很通俗,自己觉得这样理解可能会合适些:无论什么类型的数据,在计算机存储时都是0和1,而变量的意义,就是以不同的方式来解释这些数据,以达到满足程序应用、节约内存等需求。

换句话说:变量存在的意义,就是建立规(标)范(准)的数据存储方式

  • 隐式转换

类型转换分两种形式:隐式转换、显示转换。

隐式转换不需要单独的表达式,只需要把满足隐式转换条件的两个变量做相应的表达式操作即可,但隐式转换的结果可能并不是自己意料之中的:

            ushort destinationVar;
char sourceVar = 'a';
destinationVar = sourceVar;
Console.WriteLine("sourceVar: {0}", sourceVar);
Console.WriteLine("destinationVar: {0}\n",destinationVar);

上面的输出结果,sourceVar的是a,而destinationVar虽然=sourceVar,但输出的结果是97。可以看出,虽然两种数据类型满足隐式转换的条件(存储的值范围),但不同的表达类型决定了最终的结果也不一样。另外,和大多数编程一样,隐式转换时,只要类型A的取值范围比类型B的范围小,就可以隐藏转换为B。

  • 显示转换

在显示转换中,可以使用强制转换和Convert。

强制转换只在某些情况下可以,可能应用的场景不太丰富,当然,这个的确要方便一些,在变量前加上类似 (byte) 的代码就可以了:

            byte destinationVar;
short sourceVar = 281;
destinationVar = (byte)sourceVar;
Console.WriteLine("sourceVar: {0}", sourceVar);
Console.WriteLine("destinationVar: {0}\n",destinationVar);

这个例子比较有意思,输出的结果是:sourceVar: 281, destinationVar: 25; 为什么不是变更为255?这就回到开头提到的了,其实转换过程中,丢掉的是数据存储的二进制位:

在转换的过程中,会把超过取值范围(255二进制位)的那个1丢掉,保留其它的位,所以最终结果是25,而不是255,也不是281。

Convert转换应该是常用的方式,因为它始终会进行溢出检查。

  • 溢出检查配置

有些东西虽然没什么用,但是我们应该知道,否则出问题的时候就不知道怎么解决了。配置:解决方案资源管理器 - 右键 - 属性 - 生成 - 高级 - 检查运算上溢/下溢:

当然,对于强制转换可能需要这个配置,但使用Convert转换时始终会进行溢出检查的,所以这个配置和checked/unchecked就不起作用了。

  • 结语

每次一看见那些数据类型、表达式的列表表格就头疼,因为根本记不住。就像哪些类型可以怎么转换成其它的类型的表格一样,其实个人感觉大可不必去记住这些,在实际做项目的过程中,只要记得有这方面的功能就行了,具体用哪一个,可以再回过头来翻书或google。

应该掌握的是:记住存在隐式转换,但这种方式应该尽量少用吧。而显示转换,方便的就直接用(),当然,最可靠的应该是Convert,因为在转换时,Convert始终都会进行溢出检查。

至于这些区别,可能还要以后多用用才能感受出来。

最新文章

  1. Win10系统出问题?简单一招即可修复win10!
  2. ZeroMQ接口函数之 :zmq_ipc – ZMQ本地进程间通信传输协议
  3. MYSQL使用正则表达式过滤数据
  4. rm 注意
  5. JS身份证真实性校验(一)
  6. 【原创教程】JavaScript详解之语法和对象
  7. python gzip 压缩文件
  8. Unity3D脚本使用:Time
  9. 最大流算法之ISAP
  10. 【bzoj 3309 】 DZY Loves Math
  11. c# winform打印excel(使用NPOI+Spire.xls+PrintDocument直接打印excel)
  12. hadoop 分析
  13. Spring中的AOP 专题
  14. Caused by: java.lang.ClassNotFoundException: org.springframework.integration.handler.support.HandlerMethodArgumentResolversHolder
  15. 「Android」消息驱动Looper和Handler类分析
  16. NYOJ 方案数量
  17. hibernate的三种状态和缓存
  18. Eclipse绿豆沙护眼
  19. c# ?. 空值传播运算符
  20. Docker基础-端口映射与容器互联

热门文章

  1. PARSEC-3.0编译错误
  2. new date() 在Linux下引起的时间差问题
  3. PHPMyAdmin弱口令猜解【Python脚本】
  4. Install Debian note
  5. 关于a和b不用第三变量交换值的问题
  6. C++ 中静态成员函数访问非静态成员变量的方法
  7. Network Alignment(网络比对)模型
  8. app后端设计(12)--图片的处理
  9. 【python】多进程锁multiprocess.Lock
  10. Controller