[.net 面向对象编程基础] (4) 基础中的基础——数据类型转换
[.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 |
|
|
char |
|
|
double |
|
|
short |
|
|
int |
|
|
long |
|
|
float |
|
|
ushort |
|
|
uint |
|
|
ulong |
示例一:
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) 基础中的基础——数据类型转换的更多相关文章
- C#高级编程四十一天----用户定义的数据类型转换
用户定义的数据类型转换 C#同意定义自己的 数据类型,这意味着须要某些 工具支持在自己的数据类型间进行数据转换.方法是把数据类型转换定义为相关类的一个成员运算符,数据类型转换必须声明为隐式或者显式,以 ...
- Python基础之模块、数据类型及数据类型转换
一.模块 1.标准库 不需要安装,直接调入使用的模块. import sys模块: import sys print(sys.path) #打印环境变量绝对路径 print(sys.argv) #打印 ...
- C#入门经典第八章面向对象编程-3-Windows应用程序中的OOP
实例一:使用对象.代码如下: 首先从工具箱中拖一个按钮,并添加事件. private void button2_Click(object sender, EventArgs e) {//按钮的Butt ...
- Python基础笔记:input()输入与数据类型转换
input就是个万能输入,不过input输入的元素都是以str形式保存的,如果要他作为一个整数的话,就需要进行数据类型转换. input的使用 name=input('please input you ...
- Java JNI 编程进阶 实例+c++数据类型与jni数据类型转换
原文:http://www.iteye.com/topic/295776 JNI一直以来都很少去关注,但却是我心中的一个结,最近这几天刚好手头有点时间,因此抽空看了一下这方面的东西,整理了一份文档,J ...
- 【MongoDB】C#中的Mongo数据类型转换
用过Mongo的人都知道,Mongo使用的是Bson类型,有string,int,date,bool等数据类型,具体就不详述了. 在使用Mongo 的C#官方驱动时会碰到一个问题,如何将Bson中的数 ...
- .net中三种数据类型转换区别((int),Int32.Parse() 和 Convert.toInt32() )
(typename)valuename,是通用方法: Convert类提供了灵活的类型转换封装: Parse方法,适用于向数字类型的转换. 例如,(int),Int32.Parse() 和 Conve ...
- ibtais中把clob数据类型转换成string并展示到前台
1,在xml中定义一个resultMap <resultMap class="com.aa.bb" id="clobToString"> <r ...
- ibtais中把clob数据类型转换成string并插入到数据库中
1,在xml中定义一个parameterMap <parameterMap id="stringToClob" class="com.a.b.c"> ...
- js中Math()函数&&数据类型转换
Math()函数: x的y次方:Math.pow(x,y) 取小数点后两位:num.toFixed(2) 数据类型转换: 字符串转换为数字:parseInt(num)转换为整数:parseFloat( ...
随机推荐
- myeclipse性能优化
1. 取消启动项.这个设置立竿见影.Window->Preferences->General->Startup and Shutdown, Plug-ins activated on ...
- 引入Ember插件 大概流程
引入Ember插件 xxx (转自美女同事 LZX) 1.ember install xxx(过程中可能会提示你安装其他包 按照提示语安装就行) 2.安装之后会看到 工作目录里已经出现了下载好的安 ...
- java中用spring实现数组类型输出
java 中的几个数组类型 1.Department类 package com.yy.collection; import java.util.List; import java.util.Map; ...
- 大前端学习笔记整理【六】this关键字详解
前言 在上一篇博客里我总结了下辨认this指向的四种方式,但是有师兄抛出一个问题来,我发现那些this的指向并不能说明更复杂的情况,先看下这段代码 var a = { name: 'a', getNa ...
- Selenium2+python 常用函数汇总
1. driver = webdriver.Chrome() --新建实例 2.driver.find_element_by_id("username") ---通过标签属性id ...
- node学习笔记(四)
//Node.js标准库提供了http模块,其中封装了一个高效的http服务器和一个简易的http客户端 //http.Server是一个基于事件的HTTP服务器,它的核心由Node.js下层c++部 ...
- Android学习 之 ColorStateList按钮文字变色
首先添加一个ColorStateList资源XML文件,XML文件保存在res/color/button_text.xml: <?xml version="1.0" enco ...
- zabbix3.0 微信告警
首先需要申请一个企业号,其实公众号也可以,不过脚本不一样.而且公众号任何人都可以关注,有泄密的风险.企业号只有指定的人可以关注,安全性较高.申请企业号,需要一个绑定你本人开户银行卡的微信号. 申请网址 ...
- URI和URL、URN区别
URI不能读取/写入资源,这是统一的资源定位器(URL)的任务.URL是一种URI,它的schema是已知的网络协议,并且它把URI与某种协议处理程序联系起来(一种与资源通讯的读/写机制).URI一般 ...
- java线程池初步理解
多线程基础准备 进程:程序的执行过程,持有资源和线程 线程:是系统中最小的执行单元,同一个进程可以有多个线程,线程共享进程资源 线程交互(同步synchronized):包括互斥和协作,互斥通过对象锁 ...