review——C# (15)转换
FROM P286
1.数字的转换
1.1溢出检测上下文
显示转换可能会丢失数据并且不能在目标类型中同等地表示源值。对于整数类型,C#给我们提供了选择运行时是否应该在进行类型转换时检测结果溢出的能力。通过checked运算符和checked语句来实现。
□代码片段是否被检查称作溢出检测上下文
--如果我们指定一个表达式或一段代码为checked,CLR会在转换产生溢出时抛出一个OverFlowException异常。
--如果代码不是checked,转换会继续而不管是否产生溢出
(1)checked和unchecked运算符
*控制表达式的溢出检测上下文。表达式放置在一对圆括号内并且不能是一个方法。语法如下:
checked(表达式)、unchecked(表达式)
(2)checked语句和unchecked语句
作为运算符时用于圆括号内的单个表达式。而用作语句时执行相同的功能,但控制的是一块代码中的所有转换,而不是单个表达式。
□checked语句和unchecked语句可以被嵌套在任意层次
2.引用转换
引用类型对象由内存中的两部分组成:引用和数据。
□由引用保存的那部分信息是它指向的数据类型。
□引用类型接受源引用并返回一个指向堆中同一位置的引用,但是把引用“标记”为其他类型。
2.1隐式引用转换
与语言为我们自动实现的隐式数字转换类似,还有隐式引用转换。
□所有引用类型可以被隐式转换为object类型。
□任何类型可以隐式转换到它继承的接口
□类可以隐式转换到
--它继承链中的任何类
--它实现的任何接口
2.2显式引用转换
显式引用转换是从一个普通类型到一个更精确类型的引用转换。
包括:
□
--从object到任何引用类型的转换
--从基类到从它继承的类的转换
□倒转16-18、16-19的箭头方向,即可以演示显式引用转换。
如果转换的类型不受限制,很可能会导致我们很容易地尝试引用在内存中实际并不存在的类成员。然而,编译器确实允许这样的转换。到那时,若系统在运行时遇到它们则会抛出一个异常。
2.3有效显示引用转换
(1)显示转换是没有必要的。即,语言已经为我们进行了隐式转换。e.g.
(2)源引用是null。e.g.,在下面的代码中,即使转换基类的引用到衍生类的引用通常会是不安全的,但由于源引用是null,这种转换还是允许的。
(3)由源引用指向的实际数据可以安全地进行隐式转换。
3.装箱操作 (值=》引用)
包括值类型在内的所有C#类型都派生自object类型。然而,值类型是高效轻量的类型,因为默认情况下在堆上不包括它们的对象组件。然而,如果需要对象组件,可以使用装箱(boxing)。装箱是一种隐式转换,它接收值类型的值,根据这个值在堆上创建一个完整的引用类型对象并返回对象引用。
3.1装箱是创建副本
一个有关装箱的普遍误解是在被装箱的项上发生了一些操作。其实不是,它返回的是值引用类型副本。在装箱产生之后,该值有两份副本,原始值类型和引用类型副本,每一个都可以独立操作。
4.拆箱转换 (引用=》值)
拆箱(unboxing)是把装箱后的对象转回值类型的过程。
□拆箱是显示转换
□系统在把值拆箱城ValueTypeT时执行了如下的步骤:
--它检测到要拆箱的对象实际上是ValueTypeT的装箱值。
--它把对象的值赋值到变量
5.is运算符
如先前所说,有些转换是不成功的,并且会在运行时抛出一个InvalidCastException异常,我们可以使用is运算符来检查转换是否会成功完成,从而避免盲目尝试转换。
Expr is TargetType 返回bool
如果Expr可以通过以下方式成功转换成目标类型,则返回true
□引用转换
□装箱操作
□拆箱操作(未找到例子)
通过装箱操作可转换成目标类型的例子:
static void Main(string[] args){int t = 5;object k = t;if (k is int)Console.WriteLine("!!"); Console.Read();}
输出!!,说明k is int 判断返回true。即对于某装箱结果进行判断时,会自动将其拆箱结果与目标类型进行比较。
关于is的官方文档(必看,有的内容更加详细)
6.as运算符
as运算符和强制转换运算符类似,只是它不抛出异常。如果转换失败,它返回null,而不是抛出异常。
和is运算符类似,as运算符只能用于引用转换和装箱转换,不能用于用户自定义转换或到值类型的转换。
转载于:https://www.cnblogs.com/quintessence/p/9131982.html
review——C# (15)转换相关推荐
- java 进制转换算法_算法笔记_033:十六进制转八进制(Java)
packagecom.liuzhen.systemExe;importjava.util.Scanner;public classMain {//把16进制字符串转成2进制字符串 publicStri ...
- Gerrit代码审计系统实战-Gerrit 2.15.14版本快速搭建
Gerrit代码审计系统实战-Gerrit 2.15.14版本快速搭建 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Gerrit版本选择 1>.查看Gerrit官网 ...
- Kettle基本使用(三) —— 转换的使用
01.转换_concat_fields 将多个字段合并为一个字段:字段定义了类型,如存在空值则报错 转换前: 转换后: 02.转换_值映射 华东.西南.中南映射为南区:西北.东北.华北映射为北区 映射 ...
- 计算机基础知识 进制转换,计算机基础之进制转换详解
进制转换是个老问题了,今天恰巧看见.我详细的去分析下它.留一笔吧 二进制的范围是(0-1), 不包含2 八进制的范围是(0-7) ,不包含8 十六进制的范围是(0-15) ,不包含16 先讲十进制-- ...
- Java算法学习:java进制转换(十进制转八进制,十进制转二进制,十六进制转八进制)
java进制转换(十进制转八进制,十进制转二进制,十六进制转八进制) 这几天在复习C语言的数据结构栈和队列那一章的时候,看到利用栈的特性FILO实现的进制转换十分简洁 想起了java中实现栈的操作十分 ...
- 二进制,八进制,十进制,十六进制之间的转换
1.前言 每次放假最无聊的事情,就是不想起床,不想吃饭,方正就是不想动,躺在床上,看着手机,无聊的刷着QQ空间,虽然现在已经很少人玩QQ空间,可是这种习惯一直保持到现在,都没有改变过,电脑上的QQ突然 ...
- 大话二进制,八进制,十进制,十六进制之间的转换
1.前言 每次放假最无聊的事情,就是不想起床,不想吃饭,方正就是不想动,躺在床上,看着手机,无聊的刷着QQ空间,虽然现在已经很少人玩QQ空间,可是这种习惯一直保持到现在,都没有改变过,电脑上的QQ突然 ...
- A002-185-1203
目录 一.查词文档 3 1.第一次查词 3 1.1需求基线(Requirements baseline) 3 1.2 概念聚类(Conceptual clustering) 7 1.3图形元素(Gra ...
- 应用提交 App Store 上架被拒绝
审核的参考资料 https://developer.apple.com/icloud/documentation/data-storage/index.html https://developer.a ...
- Reinforcement Learning Enhanced Heterogeneous Graph Neural Network阅读笔记
强化学习增强异质图神经网络 代码源:https://github.com/zhiqiangzhongddu/RL-HGNN 摘要 异构信息网络(HINs)涉及多种节点类型和关系类型,在许多实际应用中非 ...
最新文章
- 常用英文搜索引擎及特点
- 使用云服务器安装QEMU搭建嵌入式开发环境
- 姍姍遲來的iPhone文檔處理功能
- 【STM32】无线通信实验代码详解
- 7.MATLAB变量——矩阵操作二
- XSS跨站脚本攻击在Java开发中防范的方法
- app端微信支付(二) - 生成预付单
- 解决新版本webpack vue-cli生成文件没有dev.server.js问题
- java入门学习_Java入门学习进阶知识点
- 创建的Maven Web工程无法部署到服务器及web-app_2_3.dtd规范
- 高质量外链该怎样做?
- holtek c语言,合泰单片机c语言教程
- 2021年北京大学软件与微电子学院考研信息
- zookeeper和ZAB协议
- JavaScript: Checkbox onChange event is differently processed by IE and FF
- 决策树和随机森林预测员工离职率学习代码
- MPAndroidchart自定义样式二在柱状图上显示文本和间断式显示柱状图
- 2021网易云任务全自动每日打卡300首搭建教程
- Linux启动定时任务
- 淘宝直播2020年GMV4000亿,直播电商第一梯队出位还是出局?