对象存储 做视频网站,制作免费网站的平台,百度关键词点击排名,石家庄市建设南大街小学网站使用C#一个最常见的问题便是各种类型间的转换。我们知道#xff0c;C#中的类型分为值类型和引用类型两大类。但是#xff0c;有关它们间各自转换的细节描述在网上很少得到详细的回答。现在#xff0c;我结合搜索到的部分资料整理如下#xff1a; 1#xff0c;问题 c#中类型…使用C#一个最常见的问题便是各种类型间的转换。我们知道C#中的类型分为值类型和引用类型两大类。但是有关它们间各自转换的细节描述在网上很少得到详细的回答。现在我结合搜索到的部分资料整理如下 1问题 c#中类型转换的有两种转换和convert转换。 我想知道的是这两个转换的区别 还有就是转换我用了发现好多不能转换过来但是convert是万能转换的那什么时候该用什么时候该用convert呢 最后问下子把int sum 怎么用转换成float类型 请详细说明最好有举例。 解答 (1)这两个方法的最大不同是它们对null值的处理方法Convert.ToInt32(null)会返回0而不会产生任何异常但int.Parse(null)则会产生异常。 没 搞清楚Convert.ToInt32和int.Parse()的细细微区别时千万别乱用否则可能会产生无法预料的结果举例来说假如从url中取一 个参数page的值我们知道这个值是一个int所以即可以用 Convert.ToInt32(Request.QueryString[page])也可以 用,int.Parse(Request.QueryString[page])但是如果page这个参数在url中不存在那么前者将返回00 可能是一个有效的值所以你不知道url中原来根本就没有这个参数而继续进行下一下的处理这就可能产生意想不到的效果而用后一种办法的话没有page 这个参数会抛出异常我们可以捕获异常然后再做相应的处理比如提示用户缺少参数而不是把参数值当做0来处理。 (2)还有一点区别就是a. Convert.ToInt32(double value)如果 value 为两个整数中间的数字则返回二者中的偶数即 3.5转换为44.5 转换为 4而 5.5 转换为 6。 不过4.6可以转换为54.4转换为4b. int.Parse(4.5)直接报错:输入字符串的格式不正确. c. int(4.6) 4Int转化其他数值类型为Int时没有四舍五入强制转换int.Parse是转换String为intConvert.ToInt32是转换继承自Object的对象为int的.你得到一个object对象,你想把它转换为int,用int.Parse就不可以,要用Convert.ToInt32.个人总结:(1)Convert.ToInt32的参数比较多Int.Parse只能转换string类型的.(2)Parse就是把String转换成int,char,double....等,也就是*.Parse(string) 括号中的一定要是string.(3)Convert可以提供多种类型的转换,也就是Convert.*()括号中可以为很多种类型(包括string). 2问题 如何使用 as 和 is 运算符安全地进行强制转换 解答首先在MSDNhttp://msdn.microsoft.com/zh-cn/library/cc488006.aspx给出的解释非常简单过于简单。更详细的解释如下 在程序中进行类型转换是常见的事。那么在C#中支持以前语言的类型转换方法即用类型名进行强行转换例如 objectbjTest newNewType(); NewType newValue (NewType)objTest; 但是这样转换有个严重的问题就是在把objTest强转换成NewType类型对象的时候这个过程是不安全的因此需要用try-catch语句来进行保护。这样一来比较安全的代码方式应该如下所示。 objectbjTest newNewType(); NewType newValue null; try { newValue (NewType)objTest; } catch( Exception err ) { MessageBox.Show( err.Message ); } 但是如上的写法在C#中已经属于过时的写法而且也属于比较低效的写法。在C#中比较高效而且安全的写法应该用as操作符那么完成如上类似功能的正确代码应该如下。 objectbjTest newNewType(); NewType newValue objTestasNewType; 那么很明显如上的写法首先看起来很简便至少代码数量和强转方式一样。至于安全性对于as操作符来说它不会做过的转换操作当需要转换对象的类型属于转换目标类型或者转换目标类型的派生类型的时候那么此转换操作才能成功而且并不产生新的对象。因此用as来进行类型转换使安全的。为什么用as操作符进行类型转换的效率要高于老式的类型转换的因为用as操作符进行转换就如前面所说的首先判断当前对象的类型当类型满足要求后才进行转换。而传统的类型转换方式是用当前对象直接去转换而且为了保护转换成功要加上try-catch这就决定了它的效率不会高于as操作符的效率。 要注意的时候不管用传统方式还是用as操作符进行类型转换之后在使用之前需要进行判断转换是否成功如下 if( newValue!null) { //Work with the object named newValue } 但是使用as操作符有如下几点限制。 第一个就是不用在类型之间进行类型转化即如下编写就会出现编译错误。 NewType newValue newNewType(); NewType1 newValue newValueasNewType1; 第二个就是不能应用在值类型数据即不能如下写也会出现编译错误。 objectbjTest 11; intnValue objTestasint; 对于第一点所提的可以用传统的类型转换方式来完成但是光用如下的方式是不能正确完成。 NewTypeOne newTestOne newNewTypeOne(); NewTypeTwo newTestTwo (NewTypeTwo)newTestOne; 但是光如上写是不能完成的要想使如上的操作能正确完成在原有类型中增加类型转换操作符函数即需要完成类似如下的代码。 publicclassNewTypeOne { publicstatic explicitoperatorNewTypeTwo( NewTypeOne objTest ) { //Convert object into new type } } 对于第二点所提的在C#中可以使用is操作符再加上老式的类型转换操作就可以安全完成转换那么要完成如上操作正确的写法如下。 objectbjTest 11; if( objTestisint) { intnValue (int)objTest; } 除了如上两点限制外在用as操作符来进行类型转换的时候有个细微的问题。在前面所说的用as来进行类型转换的时候所要转换的对象类型必须是目标类型或者转换目标类型的派生类型那么这样就有个问题即用as操作符来进行类型转换的时候无法转换成正确的类型也就是说本来应该转换成子类型却转换成了父类型。但是我并不认为这是个严重问题因为在用as操作符来进行类型转换的时候如何选择目标类型在编码的时候已经很明确了即用父类型作为目标类型那么类型转换的目的就是转换成父类型对象进行操作反之亦然。 在C#中已经提供了一个很好的类型转换方式那么在进行类型转换的时候可以按照如下的方式进行选择。 类型转换 使用选择 Object 已知引用类型 使用as操作符来完成 Object 已知值类型 先使用is操作符来进行判断再用类型强转方式进行转换 已知引用类型之间转换 首先需要相应类型提供转换函数再用类型强转方式进行转换 已知值类型之间转换 最好使用系统提供的Convert类所涉及的静态方法 转载于:https://www.cnblogs.com/Areas/archive/2011/09/27/2193228.html