C#中的类型转换

71e579630184b28033eab94c80431acd.png

前几篇文章中经常说到强制类型转换,就是可以将派生类对象强制转换为基类对象的做法或者通过as运算符进行的转换。

今天我们就来一起简单了解复习下在C#中都有哪些类型的转换。

要理解转换很容易,日常的开发编码过程中,由于变量类型的不同我们可能会根据业务的变更会进行变量值之间的转换。这里就会出现类型转换。比如Int型变量转换为String类型等等。

这里转换是接受一个类型的值并使用它作为另一个类型的等价值的过程,转换后的值应和源值一样。

如下就是典型的强制类型转换

short temp = 5;sbyte tempTwo = 20;tempTwo = (sbyte)temp;

类型转换

在进行数据转换的过程中,很多时候会存在数据精度丢失的问题,比如在和下位机进行通信的过程中,可能两者通过固定协议来传输和解析字段,这时候对于数据精度的关注就特别重要,不可出现转换不对的问题。

比如协议里面某字段要求是8字节的double类型,你在转换的过程中不能转换为4字节的float。

但是在进行转换的过程中有些类型就不会丢失数据和精度,比如将8位的值转换为16位值数据。这就是所谓的隐式转换。语言在使用过程中,编译器会自动进行转换。

当从位数更少的源转换为位数更多的目标类型时,目标中多出来的位需要用0或1填充;当从更小的无符号类型转换为更大的无符号类型时,目标类型多出来的最高位都以0进行填充,也就是所谓的零扩展。对于有符号的类型的转换而言,额外的高位用源表达式的符号位进行填充。

这里既然有隐式转换和强制类型转换,那么也就会有显示转换。比如我们想将短类型转换为长类型,在长类型里面很容易放下短类型的值,但是如果反过来,这里就会出现问题。在短类型中,无法放下所有长类型的内容,就会出现数据或精度的丢失。

下面是C#中各个类型的字节长度

1)   bool, System.Boolean 类型,它用于声明变量来存储布尔值 true 和 false。
2)   sbyte, System.SByte 类型,最小值为-128,最大值为127,可显示转换为 int、long、double、float、decimal 类型。
3)   byte, System.Byte 类型,最小值为0,最大值为255,可显示转换为 int、long、double、float、decimal 类型。
4)   short, System.Int16 类型,最小值为-32768,最大值为32767,可显示转换为 int、long、double、float、decimal 类型。
5)   ushort, System.UInt16 类型,最小值为0,最大值为65535,可显示转换为 int、long、double、decimal、float 类型。
6)   int, System.Int32 类型,最小值为-2147483648,最大值为2147483647;可显示转换为 long、double、decimal、float 类型。
7)   uint, System.UInt32 类型,最小值为0,最大值为4294967295,声明 uint 类型变量使用后缀 u或U,可显示转换为 long、double、decimal、float 类型。
8)   long, System.Int64 类型,最小值为-9223372036854775808,最大值为9223372036854775807L,声明 long 类型变量使用后缀 l或L,可显示转换为 double、decimal、float 类型。
9)   ulong, System.UInt64 类型的最小值为0,最大值为18446744073709551615,声明 long 类型变量使用后缀 ul或UL,可显示转转为 double、decimal、float 类型。
10)  float, System.Singe 类型,最小值为-3.4 × 1038,最大值为+3.4 × 1038,表示存储32位浮点值的简单类型,声明 float 类型变量使用后缀 f或F,可显示转换为 double 类型,转为 int、long、decimal 类型,需隐式转换。
11)  double, System.Double 类型,最小值为±5.0 × 10−324,最大值为±1.7 × 10308,表示存储64位浮点值的简单类型,声明 double 类型变量使用后缀 d或D;换为 int、long、float、decimal 类型,需隐式转换。
12)  decimal, System.Decimal 类型的大致范围(-7.9 x 1028 - 7.9 x 1028) / (100 - 28),表示128位数据类型,同浮点型相比,decimal 类型具有更高的精度和更小的范围,这使它适合于财务和货币计算,声明 decimal 类型变量使用后缀 m或M,转为 int、long、double、float 类型,需隐式转换。
13)  char, System.Char 类型范围(U+0000 到 U+FFFF),用于声明 .NET framework 使用Unicode字符表示 System.Char 结构的实例;可显示转换为 short、int、long、float、double、decimal 类型。转为 string 类型,需使用 ToString() 方法。
14)  enum, System.Enum 类型,一种由一组称为枚举数列表的命名常量组成的独特类型。
15)  struct 类型,通常用来封装小型相关变量组,例如:矩形的坐标或库存商品的特征。

在C#中会经常使用Convert类下的方法进行类型之间的转换工作。216d6696ed682f1d0016fdb40a61caaa.png

int ahui=27;string age = Convert.ToString(ahui);double ageTwo = Convert.ToDouble(ahui);Single ageThree=Convert.ToSingle(ahui);

隐式引用转换

  • 所有引用类型可以被隐式转换为object类型

  • 任何类型可以隐式转换到它继承的接口

  • 类可以隐式转换到继承链的任何类或它实现的任何接口

显示引用转换

  • 从object到任何引用类型的转换

  • 从基类到从它继承的类的转换

装箱和拆箱

装箱:指在C#的转换过程中值类型到引用类型的转换过程称为装箱。

拆箱:指将装箱后的对象(引用类型)转换到值类型的过程。

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

//int 为值类型;  string为引用类型 
int ahui;
string age;ahui=27;                           
//装箱操作
age = Convert.ToString(ahui);      
//拆箱操作
ahui = Convert.ToInt32(age);

寄语

人生短暂,我不想去追求自己看不见的,我只想抓住我能看得见的。

原创不易,给个关注。

我是阿辉,感谢您的阅读,如果对你有帮助,麻烦点赞、转发  谢谢。

4aa07be432ce0133f024d068c3508383.png

往期推荐

C#中的协变和逆变

C#中泛型约束的具体用法

C#中泛型的用法

C#中的泛型

a18d8d7ead192a02cd6e1f2e9c6f4345.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Excel 用于批量把单元格设置为文本格式保存的数字的宏

首先把所有的数字录入(或者导出为)井号数字的格式,比如“#3333333323424234234234”,然后运行下面的宏: Sub Num2Text()If Not TypeOf Application.Selection Is Range ThenMsgBox "You must select cells!"…

ACM题解系列之一:刘汝佳:《算法竞赛入门经典》(第2版)

题是书中的题,解法参照了书中的解法,不少解法都做了简化和改进。 做程序,就要努力做到自己的程序是最好的! 第3章例题 POJ1488 UVA272 UVALive5381 TEX Quote【输入输出】 POJ2538 ZOJ1884 UVA10082 WERTYU【输入输出】 HDU1318 P…

linux之快速过滤文本的关键字以及快速过滤目录下的关键字

1、快速过过滤文本的关键字 cat file | grep 关键字 比如Android日志文件很长,需要过滤Exception,就可以用这个办法,如下图 2、快速过滤目录下的关键字 grep -r 关键字 比如我们在linux上看目录下哪些关键字段,好像开发工具里面的 find usag…

hadoop使用

2019独角兽企业重金招聘Python工程师标准>>> 框架简介 Hadoop使用主/从(Master/Slave)架构,主要角色有NameNode,DataNode,secondary NameNode,JobTracker,TaskTracker组成。 其中Nam…

bigint hive java类型_详解Apache Hudi如何配置各种类型分区

1. 引入Apache Hudi支持多种分区方式数据集,如多级分区、单分区、时间日期分区、无分区数据集等,用户可根据实际需求选择合适的分区方式,下面来详细了解Hudi如何配置何种类型分区。2. 分区处理为说明Hudi对不同分区类型的处理,假定…

C#中的命名空间和程序集

前言今天这篇文章和大家一起学习下C#语言下的命名空间和程序集。在日常的编码工作中,我们对命名空间和程序集都不会很陌生。在创建项目文件时,IDE自动会为我们创建好一个大的命名空间和程序集。大多数业务代码都是在解决方案下各自的命令空间里进行编码的…

C/C++预处理宏的总结

1.定义顺序的无关性 #define PI 3.14 #define TWO_PI 2*PI 这两句谁前谁后无所谓,因为预处理器不断迭代来实现宏替换,直到源文件中没有宏了才停止。 2. 宏变量变成字符串 #define str(x) #x 例子:str (teststring) > "teststrin…

基于jQuery的ajax系列之用FormData实现页面无刷新上传

接着上一篇ajax系列之用jQuery的ajax方法向服务器发出get和post请求写,这篇主要写如何利用ajax和FormData实现页面无刷新的文件上传效果,主要用到了jQuery的ajax()方法和XMLHttpRequest Level 2的FormData接口。关于FormData,大家可以看MDN文…

linux网络编程之用多线程实现客户端到服务端的通信(基于udp)

1、开启一个线程接受数据,主线程发送数据的代码 #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <pthread.h> #include <netinet/in.h> #include <errno.h> #include <sys/time.h&g…

Apache FTPClient操作文件上传下载及公共类

我们在项目中可能需要使用ftp进行文件的上传、下载、获取服务器目录信息等相关操作&#xff0c;我们可以使用apache的FTPClient进行相关的操作&#xff0c;下面把相关公共方法与大家交流分享&#xff0c;每个方法前都有详细的注释进行讲解&#xff0c;不过在进行ftp测试的时候&…

abd shell关闭所有程序_在后台服务器上运行程序

之前总结过screen的用法&#xff0c;但还可以用nohup命令。nohup工具&#xff1a;Linux系统中有提供一个很好的不挂断地运行命令——nohup。我们使用nohup能很简单的控制使用&#xff0c;在此就简单的介绍一下nohup工具。nohup 命令nohup就是不挂起的意思( no hang up)。用途&a…

优秀的JavaScript模块是怎样炼成的

引言&#xff1a;如今的JavaScript已经是Web上最流行的语言&#xff0c;没有之一。从Github上的语言排行榜https://github.com/languages上即可看出&#xff0c;也是如今最为活跃的开源社区。随着Node的加入&#xff0c;JavaScript开枝散叶进入服务器领域&#xff0c;为这个语言…

解锁JDK 12的奇妙之旅:新特性详解

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 解锁JDK 12的奇妙之旅&#xff1a;新特性详解 前言switch表达式拓展NumberFormat对复杂数字的格式化字符串支持transform、indent操作新增方法Files.mismatch(Path, Path)Teeing Collector支持unicode…

.NET6之MiniAPI(十四):跨域CORS(上)

为了说明跨请求&#xff0c;创建了两个项目&#xff0c;一个mini api&#xff0c;端口是5001&#xff0c;另一个razor page项目&#xff0c;端口是5280。5280项目会在页面用ajax的方式来请求5001&#xff0c;形成跨域请求&#xff0c;由于是本地测试&#xff0c;host都是localh…

Linux文件锁学习-flock, lockf, fcntl

参考 linux中fcntl()、lockf、flock的区别 这三个函数的作用都是给文件加锁&#xff0c;那它们有什么区别呢&#xff1f; 首先flock和fcntl是系统调用&#xff0c;而lockf是库函数。lockf实际上是fcntl的封装&#xff0c;所以lockf和fcntl的底层实现是一样的&#xff0c;对文件…

linux网络编程之sockaddr_in和in_addr区别

1、struct in_addr struct in_addr就是32位IP地址。 struct in_addr { union {struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;struct { u_short s_w1,s_w2; } S_un_w;u_long S_addr;} S_un;#define s_addr S_un.S_addr }; 2、sockaddr_in struct sockaddr_in …

入驻

新手登录~

django model filter 条件过滤,及多表连接查询、反向查询,某字段的distinct

2019独角兽企业重金招聘Python工程师标准>>> 1.多表连接查询&#xff1a;当我知道这点的时候顿时觉得django太NX了。 class A(models.Model): name models.CharField(u名称) class B(models.Model): aa models.ForeignKey(A)B.objects.filter(aa__name__c…

利用tabluea分析数据的案例_利用德温特分析Dartsip的案例检索结果

德温特创新平台(Derwent Innovation)与Darts-ip知识产权案例数据库均是科睿唯安旗下的知识产权数据库&#xff0c;虽然这两个数据库的侧重点分别在于专利信息与知识产权判例&#xff0c;但若将两者结合使用则能发挥11>2的作用&#xff0c;打通专利全生命周期。关注我们的朋友…

浅谈C#可变参数params

前言前几天在群里看到群友写了一个基础框架&#xff0c;其中涉及到关于同一个词语可以添加多个近义词的一个场景。当时群友的设计是类似字典的设计&#xff0c;直接添加k-v的操作&#xff0c;本人看到后思考了一下觉得使用c#中的params可以更优雅的实现一个key同时添加一个集合…