一 什么是转换

转换是接受一个类型的值并使用它作为另一个类型的等价值的过程。

下列代码演示了将1个short类型的值强制转换成byte类型的值。

short var1 = 5;
byte var2 = 10; var2 = (byte) var1; //强制转换,将var1的值转换成byte类型

二 隐式转换

有些类型的转换不会丢失数据与精度,如将8位的值转换成16位的值是非常容易的,不会丢失精度。

C#语言会自动进行转换,称为隐式转换。

从位数更少的源转换成位数更多的目标类型时,目标中多出的位需要用0或1填充。

当从更小的无符号类型转换为更大的无符号类型时,目标类型多出的最高位都以0进行填充,这叫做零扩展。

下图演示使用零扩展将8位的10转换成16位的10:

对于有符号类型的转换而言,额外的高位用源表达式的符号位进行填充,这样就维持了被转换值的正确符号和大小。

下图演示符号扩展:

三 显示转换和强制转换

尝试将ushort值1365转换为byte值,会导致数据丢失。

对于预定义类型,C#会自动将一个数据类型转换成另一个数据类型,但只是针对那些从源类型到目标类型不会发生数据丢失的情况。

而对于从源类型到目标类型转换会发生数据丢失的情况,C#不提供自动转换,就需要使用显示转换。这叫做强制转换表达式。

四 转换的类型

有很多标准的、预定义的用于数字和引用的转换。

除了标准转换,还可以为自定义类型定义隐式转换和显示转换。

装箱:将值类型转换为object类型、System.ValueType类型。

拆箱:将一个装箱的值转换为原始类型。

五 引用转换

引用类型对象有内存中的两部分组成:引用和数据。

由引用保存的那部分信息是它指向的数据类型。

引用转换接受源引用并返回一个指向堆中同一位置的引用,但是把引用标记为转换的目标类型。

下例给出两个引用变量,myVar1和myVar2,它们指向内存中的相同对象。

class Program
{
static void Main(string[] args)
{
B myVar1 = new B();
A myVar2 = (A)myVar1; //将myVar1作为A类的引用返回 Console.WriteLine(myVar1.Field1); //正确
Console.WriteLine(myVar2.Field2); //错误,Field2对于myVar2不可见
}
} class A { public int Field1; } class B : A { public int Field2; }

5.1 隐式引用转换

C#可以自动实现隐式引用转换。

  • 所有引用类型都可以被隐式转换为object类型;
  • 任何类型可以隐式转换到它继承的接口;
  • 类可以隐式转换到它继承链中的任何类和它实现的任何接口。

5.2 显示引用转换

显示引用转换是从一个普通类型到一个更精确类型的引用转换。

显示转换包括:

  • 从object到任何引用类型的转换;
  • 从基类到从它继承的类的转换。

六 装箱转换和拆箱转换

6.1 装箱转换

装箱是一种隐式转换,它接受值类型的值,根据这个值在堆中创建一个完整的引用类型对象并返回对象引用。

6.2 拆箱转换

拆箱是把装箱后的对象转换回值类型对象的过程。

拆箱是显示转换。

系统在把值拆箱成ValueTypeT时执行了如下步骤:

  • 它检测到要拆箱的对象实际是ValueTypeT的装箱值;
  • 它把对象的值复制到变量。

七 用户自定义转换

除了标准转换,我们还可以为类和结构自定义隐式转换和显示转换。

语法如下:

public static implicit operator TargetType (SourceType Identifier)
{
. . .
return ObjectOfTargetType
}

用户自定义转换的约束:

  • 只可以为类和结构定义用户自定义转换;
  • 不能重定义标准隐式转换或显示转换;
  • 对于源类型S和目标类型T,S和T必须是不同类型;
  • S和T不能通过继承关联,S和T都不能是接口类型或object类型;
  • 转换运算符必须是S或T的成员。

implicit:隐式转换
explicit:显示转换,需要强制转换表达式

下面演示一个用户自定义转换的例子:

class Program
{
static void Main(string[] args)
{
Person bill = new Person("bill", 25);
int age = bill; //将Person对象转换为int
Console.WriteLine($"Person Info :{bill.Name},{age}"); Person none = 35; //将int转换为Person对象
Console.WriteLine($"Person Info :{none.Name},{none.Age}"); //输出:
//Person Info :bill,25
//Person Info :none,35
}
} class Person
{
public string Name;
public int Age; public Person(string name, int age)
{
Name = name;
Age = age;
} //将Person隐式转换为int
public static implicit operator int(Person p)
{
return p.Age;
} //将int隐式转换为Person
public static implicit operator Person(int i)
{
return new Person("none", i);
}
}

八 is运算符和as运算符

有些转换是非法的,会在运行时抛出一个InvalidCastException异常。我们可以使用Is运算符来检查转换是否会成功完成。

as运算符和强制转换运算符类似,只是它不抛出异常。如果转换失败,它返回null而不是抛出异常。

class Program
{
static void Main(string[] args)
{
var student = new Student();
student.Name = "jack";
student.Age = 16;
// is 第1种用法:检测student是否能转换为Person类型,如果可以,则返回true
if (student is Person)
{
Console.WriteLine("stundent is Person");
}
// is 第2种用法:检测student是否能转换为Person类型,如果可以,则返回true,并将其转换赋值给Person类型的变量p
if (student is Person p)
{
Console.WriteLine($"Person p:{p.Name},{p.Age}");
} // as 用法
var p1 = student as Person;
if (p1 != null)
{
Console.WriteLine($"Person p:{p1.Name},{p1.Age}");
}
}
} class Person
{
public string Name;
public int Age;
} class Student : Person { }

 

C#-12 转换的更多相关文章

  1. IO流12 --- 转换流InputStreamReader --- 技术搬运工(尚硅谷)

    InputStreamReader 将字节输入流转换为字符输入流 @Test public void test1(){ InputStreamReader isr = null; try { //字节 ...

  2. ABBYY如何把图片转换成pdf格式

    在制作工作文件的时候,有时候会遇到需要进行文件格式转换的情况,比较常见的文件格式转换就包含了Office与pdf格式之间的转换.但除此之外,图片与pdf格式也是可以进行转换的,那么图片要怎么操作,才能 ...

  3. Scala入门系列(十二):隐式转换

    引言 Scala提供的隐式转换和隐式参数功能,是非常有特色的功能.是Java等编程语言所没有的功能.它可以允许你手动指定,将某种类型的对象转换成其他类型的对象.通过这些功能可以实现非常强大而且特殊的功 ...

  4. AutoMapper实现对象转换的几种方式

    namespace ConsoleApplication1 { class Program { static void Main(string[] args) { //1.普通转换 Name name ...

  5. ABBYY FineReader 12使用教程

    说到OCR图文识别软件,自然少不了ABBYY FineReader 12.ABBYY FineReader 12可快速方便地将扫描纸质文档.PDF文件和数码相机的图像转换成可编辑.可搜索的文本.我们已 ...

  6. Python 进制转换与位运算

    十进制转二进制.八进制.十六进制: dec = int(input("输入数字:")) print("十进制数为:", dec) print("转换为 ...

  7. mysql 字符串转数据丢失精度,mysql转换丢失精度,mysql CAST 丢失精度

    mysql 字符串转数据丢失精度,mysql转换丢失精度,mysql CAST 丢失精度 =============================== ©Copyright 蕃薯耀 2017年9月1 ...

  8. 类型转换构造函数 及使用explicit避免类型自动转换------新标准c++程序设计

    类型转换构造函数:  除复制构造函数外,只有一个参数的构造函数一般可以称作类型转换构造函数,因为这样的构造函数能起到类型自动转换的作用.例如下面的程序: #include<iostream> ...

  9. Socket编程实践(1) 基本概念

    1. 什么是socket socket可以看成是用户进程与内核网络协议栈的编程接口.TCP/IP协议的底层部分已经被内核实现了,而应用层是用户需要实现的,这部分程序工作在用户空间.用户空间的程序需要通 ...

随机推荐

  1. salt stack学习笔记

    saltstack运行模式: local master/minion salt ssh saltstack三大功能 远程执行命令 配置管理(状态管理) 云管理 安装: master  salt-mas ...

  2. go将青龙面板里面的脚本文件都下载到本地

    纯粹练手用的,大家轻喷 青龙面板的脚本文件可以下载到本地,这样的话自己可以研究一下对应的脚本文件,能学到更多的知识,原理其实很简单,F12一下就知道了,青龙面板使用Request Headers里面放 ...

  3. 用JavaScript写随机出一个颜色

    function changeColor(){ var r = parseInt(Math.random()*255) var g = parseInt(Math.random()*255) var ...

  4. mui 登录跳转到首页之后顶部选项卡不灵敏问题

    前段时间开发一个用mui开发app的时候遇到了登录跳转到首页之后顶部选项卡会失灵的问题,多次尝试之后终于解决了,趁现在还有点印象记录一下吧. 一开始我是用mui.openWindow来新开首页的,出了 ...

  5. 来看看这位年轻的 eBay 小伙是如何成为 Committer

    介绍一下我自己 目前就职于eBay中国,专注于微服务中间件,分布式架构等领域,同时也是狂热的开源爱好者. 如何成为一个commiter 过去几个月,我一直持续在为 Apache DolphinSche ...

  6. 在 WXML 中直接使用 JS 代码

    因为有在 Vue 下开发应用的习惯,希望能够直接在 wxml 中的标签里使用 JS 代码.微信小程序其实也是可以的,在使用 JS 代码的时候需要用{{}}来包裹起来. 以下是在 wxml 中使用 JS ...

  7. 云服务器上搭建cobalt strike遇到的一些小问题

    一.前言: 当你兴高采烈的买了一台云服务器,迫不及待地想去搭建传说中的神器cobalt strike的时候,你可能会遇到以下的一些小问题,这里我会列出对应的解决方法. 二.遇到的一些小问题 1.上传文 ...

  8. OpenStack云计算平台部署(单节点)

    环境配置 虚拟机(centos7 .内存8G.硬盘300G.处理器4核并开启intel vt-x,网络模式设置为NAT,虚拟机网络一定要设置好,并可以ping通baidu,不然有中途掉IP的情况发生) ...

  9. Yarn上运行spark-shell和spark-sql命令行

    spark-shell On Yarn spark-shell \ --master yarn-client \ --executor-memory 1G \ --num-executors 10 s ...

  10. 【读书笔记】C#高级编程 第六章 数组

    (一)同一类型和不同类型的多个对象 如果需要使用同一类型的多个对象,就可以使用数组或集合(后面章讲). 如果需要使用不同类型的多个对象,可以使用Tuple(元组)类型. (二)简单数组 如果需要使用同 ...