- 1、本文档共40页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第18章 C sharp
C#语言程序设计 徐虹 xh27@163.com 第十八章转换 18.1 什么是转换 ●转换是接受一个类型的值并使用它作为另一个类型的等值的过程。 ●转换后的值应和源值一样的,但它是目标类型。 18.1什么是转换 注意,var1的类型和值都没有改变。转换只是表达源值作为目标类型来使用,不是源值转换为目标类型。 18.2 隐式转换 有些类型的转换不会丢失数据或精度,语言会自动做这些转换,叫做隐式转换。 当从更小的无符号类型转换为更大的无符号类型时,目标类型多出来的最高位都以0进行填充,这叫做零扩展。 18.2 隐式转换 对于有符号类型的转换而言,额外的高位用源表达式的符号位进行填充,这样就维持了被转换的值的正确符号和大小,叫做符号扩展。 18.3 显式转换和强制转换 假设我们希望把ushort值转化为byte: ushort可以保存任何0~65535之间的值。 Byte只能保存0~255之间的值。 如果转换的ushort值小于255,就不会丢失数据,如果更大,最高位的数据会丢失。 强制转换 对于预定义类型,C#会自动将一个数据类型转换为另一个数据类型,但只是针对那些转换过程不会发生数据丢失的情况,如果会发生丢失,语言是不会提供这两种类型的自动转换的,这是要进行显式转换,叫做强制转换。 强制转换表达式结构如下: 强制转换 如果我们使用强制转换表达式,意味着我们要承担执行操作可能会引起丢失数据的责任。 见示例代码page_293。 18.4 转换的类型 除了标准转换,可以为自定义类型定义隐式转换和显式转换。 装箱是把预定义值类型转换为object类型或System.ValueType类型。 拆箱转换装箱的值到原始类型。 18.5 数字的转换 任何数字类型都可以转换为其他数字类型,一些是隐式的,一些则应该是显式的。 18.5.1 隐式数字转换 如果有路径,从源类型到目标类型可以按照箭头进行隐式转换。 任何在从源类型到目标类型的箭头方向上没有路径的数字转换可能都是显式转换。 18.5.2 溢出检测上下文 可以通过checked运算符和checked语句来实现检测类型转换是是否发生溢出: 代码片段是否被检查称作为溢出检测上下文。 如果我们指定一个表达式或一段代码为checked,CLR会在转换产生溢出时抛出一个Overflowexception异常。 如果代码不是checked,转换会继续而不管是否产生溢出。 默认的溢出检测上下文不是checked。 1. checked和unchecked运算符 checked和unchecked运算符控制表达式的溢出检测上下文。表达式放置在一对圆括号内并且不能是一个方法,语法如下所示: checked (表达式) unchecked (表达式) 见示例代码Page_295。 2. checked和unchecked语句 checked和unchecked语句执行相同的功能,但控制一块代码的所有转换,而不是单个表达式。 checked和unchecked语句可以被嵌套在任意层次。 见示例代码Page_296。 18.5.3 显式数字转换 显式转换可能丢失数据。 1. 整数到整数 在checked情况下,如果转换会丢失数据,操作会抛出一个异常。在unchecked情况下,丢失的位不会发出警告。 2. float或double到整数 把浮点类型转换为整数类型时,值会截断为最接近的整数,如果截断后的值不在目标类型的范围内,在checked情况下,操作会抛出一个异常。在unchecked情况下,不定义它的值。 3. decimal到整数 把decimal转换为整数类型时,如果结果值不在目标类型的范围内,CLR会抛出一个异常。 4. double到float float占32位,而double占64位。Double类型的值被舍入到最接近的float类型的值。如果值太小,会被设置为正或负0,太大会被设置为正或负无穷大。 5. float或double到decimal 把源值转换为decimal并舍入到第28个decimal位后最接近的数字,如果结果值太小,会被设置为0,太大会抛出异常。 6. decimal到float或double decimal类型转换到float类型总是会成功,但是可能会损失精度。 18.6 引用转换 引用类型对象包含2部分:引用和数据。 由引用保存的那部分信息是它指向的数据类型。 引用转换接受源引用并返回一个指向堆中同一位置的引用,但是把引用“标记”为其他类型。 见示例代码Page_300。 18.6.1 隐式引用转换 所有引用类
文档评论(0)