[.net面向对象编程基础] (4)基础中的基础——数据类型转换

1.为什么要进行数据转换?

首先,为什么要进行数据转换,拿值类型例子说明一下,

比如:我们要把23角零钱,换成2.30元,就需要把整形转换成小数型。

再比如我们转换一个引用类型的数据,前面说过我们自定义类属于引用类型,假如我们定义了两个类,一个类叫“白猫”,一个类叫“黑猫”,我们要让他们都归为“猫”这个类(不管黑猫白猫,能捉老鼠就是好猫),这种情况就需要将白猫和黑猫这两个类转换成“猫”类。

因此为了运算方便,我们经常要进行不同数据类型间的转换。而且计算机在存储数据的时候,因为数据长度等不同,占用的存储空间要根据预定义好的类型事先分配。在存取之前要进行数据类型的转换。

2.C#类型转换的方式:隐式转换、显式转换、用户自定义转换、使用帮助程序类的转换

隐式转换:由于该转换是一种安全类型的转换,不会导致数据丢失,因此不需要任何特殊的语法。 例如,从较小整数类型到较大整数类型的转换以及从派生类到基类的转换都是这样的转换。

显式转换(强制转换):显式转换需要强制转换运算符。 在转换中可能丢失信息时或在出于其他原因转换可能不成功时,必须进行强制转换。典型的例子包括从数值到精度较低或范围较小的类型的转换和从基类实例到派生类的转换。

用户定义的转换:可以定义一些特殊的方法来执行用户定义的转换,从而使不具有基类–派生类关系的自定义类型之间可以显式和隐式转换。

使用帮助程序类的转换:若要在不兼容的类型之间进行转换,例如在整数与 DateTime 对象之间转换,或者在十六进制字符串与字节数组之间转换,则可以使用 BitConverter 类、Convert 类和内置数值类型的 Parse 方法,例如 Int32.Parse

3.类型转换方式选择

C#已经为我们提供了一个很好的类型转换方式,那么在进行类型转换的时候,可以按照如下的方式进行选择。

类型转换

使用选择

Object => 已知引用类型

使用as操作符来完成

Object => 已知值类型

先使用is操作符来进行判断,再用类型强转方式进行转换

已知引用类型之间转换

首先需要相应类型提供转换函数,再用类型强转方式进行转换

已知值类型之间转换

最好使用系统提供的Convert类所涉及的静态方法

4.操作符is 和 as 

通过上表,我们知道:

A.is是对类型的判断,返回值为bool类型;

B.as不校验,直接转换

C.as进行类型转换的时候,所要转换的对象类型必须是目标类型或者转换目标类型的派生类型,检查对象类型的兼容性,并返回转换结果,如果不兼容则返回null;

D.他们都在引用类型显式转换(as)类型判断(is)时使用。

5.装箱和拆箱转换(Boxing,UnBoxing)

主要是值类型与引用类型之间相互转换

如:object obj 1= 10;

int i = (int)obj; //拆箱

int j = 100;

object obj2 = j; //装箱

6.已知值类型转换类

表3中介绍了几种转换方式的选择,对于已知值类型,我们推荐使用系统类提供静态方式进行转换。

下面有必要对常用类进行说明

枚举转换

枚举类型与其他任何类型之间不存在隐式转换。而和枚举类型相关的显式转换包括:

a.从所有整数类型(包括字符类型)和实数类型到枚举类型的显式转换;

b.从枚举类型到所有整数类型(包括字符类型)和实数类型的显式转换;

c.从枚举类型到枚举类型的显式转换。

内置数值类型的 Parse 和TryParse

示例:

bool result = Int32.TryParse(value, out number);

它们两个区别在于TryParse不会引发异常

Convert 类

将一个基本数据类型转换为另一个基本数据类型。

Convert方法比较多,下面列举几个常用的

示例:int   iNumber = System.Convert.ToInt32(dNumber);        
     更多方法,详细请查询MSDN BitConverter 类

BitConverter 类

将基础数据类型与字节数组相互转换。

方法较多,详细请查询MSDN BitConverter 类

将字节数组转换为 int

返回类型

方法

bool

ToBoolean(Byte, Int32)

char

ToChar(Byte, Int32)

double

ToDouble(Byte, Int32)

short

ToInt16(Byte, Int32)

int

ToInt32(Byte, Int32)

long

ToInt64(Byte, Int32)

float

ToSingle(Byte, Int32)

ushort

ToUInt16(Byte, Int32)

uint

ToUInt32(Byte, Int32)

ulong

ToUInt64(Byte, Int32)

示例一:

byte[] bytes = { 0, 0, 0, 25 };
int i = BitConverter.ToInt32(bytes, 0);

Console.WriteLine("int: {0}", i);// Output: int: 419430400

示例二:byte[] bytes = BitConverter.GetBytes(201805978);

Console.WriteLine("byte array: " + BitConverter.ToString(bytes));

// Output: byte array: 9A-50-07-0C

日期类转换

字符串转日期
string dateString = "5/1/2008 8:30:52 AM";
DateTime date1=DateTime.Parse(dateString,System.Globalization.CultureInfo.InvariantCulture);

日期转字符串
DateTime dat1 = new DateTime();string datastr=
dat1.ToString(System.Globalization.CultureInfo.InvariantCulture);

要点:

1. C#中(int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别 

1)对于转换对象,Convert.ToInt32()可以为多种类型(例出数字类型外bool,DateTime等),int.TryParse()和int.Parse()只能是整型字符串类型(即各种整型ToString()之后的形式,不能为浮点型,否则int.Parse()就会出现输入的字符串格式不正确的错误,int.TryParse()也会返回false,输出参数为0),(int)只能是数字类型(例float,int,uint等);

2)对于空值NULL,从运行报错的角度讲,(int)强制转换和int.Parse()都不能接受NULL;Convert.ToInt32()其实是在转换前先做了一个判断,参数如果为NULL,则直接返回0,否则就调用int.Parse()进行转换,int.TryParse()其实是对int.Parse()做了一个异常处理,如果出现异常则返回false,并且将输出参数返回0;

3)针对于浮点型的取舍问题,浮点型只有Convert.ToInt32()和(int)能进行转换,但是也是进行取舍了的,Convert.ToInt32()采取的取舍是进行四舍五入,而(int)则是截取浮点型的整数部分,忽略小数部分,例如Convert.ToInt32(1.499d)和(int)1.499d都返回1,Convert.ToInt32(1.5d)返回2,而(int)1.5d还是返回1;

4)关于溢出,将大的数据类型转换为小的数据类型时Convert.ToInt32()和int.Parse()都会报溢出错误,值对于Int32太大或太小,而(int)不报错,但是返回值为-1。

如此可见,我们在进行数据转换前选择转换方法要谨慎,如果是数字类型可以考虑直接用(int)强制转换,如果是整型字符串类型的,考虑用int.Parse()进行转换,如果不是这两种类型,再考虑用Convert.ToInt32()进行转换。

2.类型转换操作符is 和 as 区别 

A.is是对类型的判断,返回值为bool类型;

B.as不校验,直接转换

C.as进行类型转换的时候,所要转换的对象类型必须是目标类型或者转换目标类型的派生类型,检查对象类型的兼容性,并返回转换结果,如果不兼容则返回null;

D.他们都在引用类型显式转换(as)类型判断(is)时使用。

==============================================================================================

返回目录 <如果对你有帮助,记得点一下推荐哦,有不明白的地方或写的不对的地方,请多交流>

==============================================================================================

[.net 面向对象编程基础] (4) 基础中的基础——数据类型转换的更多相关文章

  1. C#高级编程四十一天----用户定义的数据类型转换

    用户定义的数据类型转换 C#同意定义自己的 数据类型,这意味着须要某些 工具支持在自己的数据类型间进行数据转换.方法是把数据类型转换定义为相关类的一个成员运算符,数据类型转换必须声明为隐式或者显式,以 ...

  2. Python基础之模块、数据类型及数据类型转换

    一.模块 1.标准库 不需要安装,直接调入使用的模块. import sys模块: import sys print(sys.path) #打印环境变量绝对路径 print(sys.argv) #打印 ...

  3. C#入门经典第八章面向对象编程-3-Windows应用程序中的OOP

    实例一:使用对象.代码如下: 首先从工具箱中拖一个按钮,并添加事件. private void button2_Click(object sender, EventArgs e) {//按钮的Butt ...

  4. Python基础笔记:input()输入与数据类型转换

    input就是个万能输入,不过input输入的元素都是以str形式保存的,如果要他作为一个整数的话,就需要进行数据类型转换. input的使用 name=input('please input you ...

  5. Java JNI 编程进阶 实例+c++数据类型与jni数据类型转换

    原文:http://www.iteye.com/topic/295776 JNI一直以来都很少去关注,但却是我心中的一个结,最近这几天刚好手头有点时间,因此抽空看了一下这方面的东西,整理了一份文档,J ...

  6. 【MongoDB】C#中的Mongo数据类型转换

    用过Mongo的人都知道,Mongo使用的是Bson类型,有string,int,date,bool等数据类型,具体就不详述了. 在使用Mongo 的C#官方驱动时会碰到一个问题,如何将Bson中的数 ...

  7. .net中三种数据类型转换区别((int),Int32.Parse() 和 Convert.toInt32() )

    (typename)valuename,是通用方法: Convert类提供了灵活的类型转换封装: Parse方法,适用于向数字类型的转换. 例如,(int),Int32.Parse() 和 Conve ...

  8. ibtais中把clob数据类型转换成string并展示到前台

    1,在xml中定义一个resultMap <resultMap class="com.aa.bb" id="clobToString"> <r ...

  9. ibtais中把clob数据类型转换成string并插入到数据库中

    1,在xml中定义一个parameterMap <parameterMap id="stringToClob" class="com.a.b.c"> ...

  10. js中Math()函数&&数据类型转换

    Math()函数: x的y次方:Math.pow(x,y) 取小数点后两位:num.toFixed(2) 数据类型转换: 字符串转换为数字:parseInt(num)转换为整数:parseFloat( ...

随机推荐

  1. Eclipse导入Maven项目,使用server 启动报错,class 找不到,

    问题发现: 1.导入maven 项目后,用server 启动,选择项中没有这个项目 解决: 说明server 没有把该项目当成web项目,需要设置 项目右键 properties  ---- proj ...

  2. C# 反转字符串方法

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 反转字符 ...

  3. Hibernate缓存之Aop+cache

    在上一篇涉及到查询缓存的功能时除了需要在配置文件中开启缓存外,还需要在业务代码中显示调用setCacheable(boolean)才可以打开查询缓存的功能,这样做,无疑是破坏了封装性,所以就诞生了利用 ...

  4. 删除所选项(附加搜索部分的jquery)

    1.视图端(views)的配置为: <script> $(document).ready(function() { $("#info-grid").kendoGrid( ...

  5. 猿团YTFCloud生态系统,全面服务创业者

    9月15日,YTFCloud已正式开启了内测. 创业者翘首以待的YTFCloud,虽然让部分创业者感受到了它的神奇,但对于更多暂时无法尝试的创业者来说,它依然有一层神秘的面纱. 今天小编就来带你近距离 ...

  6. css3 2D动画的基本用法和介绍

    <style> body{height:400px;border:1px solid #000;} .box{width:90px;height:30px;border:1px solid ...

  7. ubuntu gcc-5 安装

    安装了一个ubuntu 15.10,没有集成vim,很失望,先安装个vim,sudo apt-get install vim. 开始获取g++-5: $ sudo add-apt-repository ...

  8. React的Diff算法

    使用React或者RN开发APP如果不知道Diff算法的话简直是说不过去啊.毕竟"知其然,知其所以然"这句老话从远古喊到现代了. 以下内容基本是官网文章的一个总结.压缩.这次要谦虚 ...

  9. devise 小项目(一)

    Devise源于Warden,而warden是一个基于Rack的验证权限gem,不过,使用devise实际并不需要任何关于warden的知识. 如果你之前有一些其他类似的维护验证权限功能的gem的使用 ...

  10. mysql入门安装遇到问题_2016-10-28

    1. brew安装完mysql之后直接输入mysql -u root -p 显示 can't connect to mysql server through socket, 后来问题应该是server ...