Convert.ToInt32、(int)和int.Parse三者的区别

来源:互联网 发布:java 用户管理框架 编辑:程序博客网 时间:2024/05/01 01:45
 

Convert.ToInt32、(int)和int.Parse三者的区别:

前者适合将object类类型转换成int类型,如Convert.ToInt32(session["shuzi"]);

(int)适合简单数据类型之间的转换;

int.Parse适合将string类类型转换成int类型,如int.Parse(session["shuzi"].ToString())。

(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中不存在,那么前者将返回0,0可能是一个有效的值,所以你不知道url中原来根本就没有这个参数而继续进行下一下的处理,这就可能产生意想不到的效果,而用后一种办法的话没有page这个参数会抛出异常,我们可以捕获异常然后再做相应的处理,比如提示用户缺少参数,而不是把参数值当做0来处理。

(2)还有一点区别就是
  a. Convert.ToInt32(double value)
如果 value 为两个整数中间的数字,这里是四舍五入(原创作者这里写错了。);即 3.5转换为4,而 5.5 转换为 6。 这里有一个特殊需要注意的: 4~5之间的数字,用的是5舍6入。如:4.5转换为4  4.6转换为5.

  b. int.Parse("4.5")
直接报错:"输入字符串的格式不正确".

  c. int(4.6) = 4
Int转化其他数值类型为Int时没有四舍五入,强制转换(截取整数部分)

int.Parse是转换String为int
Convert.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).
(4)至于效率上的区别可以看看这遍文章:《细说Convert和Parse到底那个效率高》 下面我就转载一下这篇文章。

 

大家都知道在进行类型转换的时候有兩个方法供我们使用就是Convert.to和*.Parse,但是疑问就是什么时候用C 什么时候用P
  通俗的解释大家都知道:
  Convert 用来转换继承自object类型的类型(当然所有的类型都是继承自object的),但是一般Convert用来转化直接就是obejct的类型,如我们用datareader从数据库取出一个数据的时候就是object类型的,此时你若用int.parse(dr["id"]);肯定会报错的,所以必须使用Convert.toint32(dr["id"]);
  而Parse用来转换String类型的数据。
  其实我们看System这个基类就会发现,他的Convert类提供了几乎所有N型到N型的转化,就是Convert也支持string类型到int型的转化,只是parse没有提供针对object的转化罢了,可以说parse是N型(除了string类型,他不提供parse的转化,仅支持 Convert到其他类型的转化)。都有的一个方法,而Convert提供了泛义上的转化。
  疑问来了,既然Convert提供了泛义的转化比如 string str="1234"; int32.parse(str);Convert.toint32(str);都可以达到相同的效果。哪么到底我们该用那一个,而那一个效果又会更好!
  来看system这个基类:
  以int到string类型的转换,不带格式的转换为例,当我们使用int32.parse(str)的时候,他其实是在调用mscorlib基类库的 system类中的构造类型int32中的Parse方法。而这个方法调用了本构造中的一个重载(Overload)方法Parse。
   

C# code
publicstatic int Parse(string s) {return Parse(s, NumberStyles.Integer,null); }




 而重载的parse中采取调用system中只读函数Nunber

C# code
publicstatic int Parse(string s, NumberStyles style, IFormatProvider provider) { NumberFormatInfo instance= NumberFormatInfo.GetInstance(provider); NumberFormatInfo.ValidateParseStyle(style);return Number.ParseInt32(s, style, instance); }




Nubmer中的PasreInt32会去执行转换。
 好,int的分析到此。看Convert的转换,
  当我们调用Convert.toint32这个方法的时候看看Convert类是怎么执行的!

C# code
publicstatic int ToInt32(string value, IFormatProvider provider) {if (value == null) {return 0; } returnint.Parse(value, NumberStyles.Integer, NumberFormatInfo.GetInstance(provider)); }



  你会发现他直接就去找了int这个类的Parse方法。而这个方法直接去执行了int32中parse的那个重载的方法。可见殊途同归他们最后到要落到只读类Number身上去进行类型转换。性能差距在进行到Number之前就产生了!在parse中他会直接找到自身,而Convert转化string到什么类型最终都是落到该类型的parse身上,所以针对string类型的转换还是本身类型的parse效率更高一些。

原创粉丝点击