前几篇文章中经常说到强制类型转换,就是可以将派生类对象强制转换为基类对象的做法或者通过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类下的方法进行类型之间的转换工作。
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);
寄语
人生短暂,我不想去追求自己看不见的,我只想抓住我能看得见的。
原创不易,给个关注。
我是阿辉,感谢您的阅读,如果对你有帮助,麻烦点赞、转发 谢谢。
往期推荐
C#中的协变和逆变
C#中泛型约束的具体用法
C#中泛型的用法
C#中的泛型