日期:2014-05-20  浏览次数:20354 次

[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

public static int Parse(string s)
{
    return Parse(s, NumberStyles.Integer, null);
}




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

C# code

public static 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


public static int ToInt32(string value, IFormatProvider provider)
{
    if (value == null)
    {
        return 0;
    }
    return int.Parse(value, NumberStyles.Integer, NumberFormatInfo.GetInstance(provider));
}
 



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


Best Regards!

Yours Turly,

Lu Jin LvKing 呂津

STJ-MIS 10896


------解决方案--------------------
哦,这么回事啊
------解决方案--------------------
parse的高 记得哪本书上说过的
------解决方案--------------------
tryparse()最高
------解决方案--------------------
转换效率高的还有as运算符,.net2.0后还有tryParse,不会引发异常, .NET类库提供的tostring()的方法也比较好用
------解决方案--------------------
探讨
tryparse()最高

------解决方案--------------------
探讨
引用:
tryparse()最高

TryParse()只是避免了当字符串不能转换成数值时不会出现异常,效率上不会比上面两个有明显的提高的。

------解决方案--------------------
http://blog.csdn.net/xuyufeng2000/archive/2007/06/18/1656043.aspx

字符串是null,那么运行结果会怎样呢?

Convert.ToInt32()在null时不抛异常而是返回0;
Int32.Parse()要抛异常;
Int32.TryParse()不抛异常,会返回true或false来说明解析是否成功,如果解析错误,调用方将会得到0值。



3个方法几乎没有差异!
如果真要追求完美那么性能的差异是:Int32.TryParse()优于Int32.Parse()优于Convert.ToInt32()。
所以个人建议:.NET1.1下用Int32.Parse();.NET2.0用Int32.TryParse()。

那么为什么会这样呢?
其实这些数据不是偶然的,因为:
Convert.ToInt32 会把最终的解析工作代理给 Int32.Parse;
Int32.Parse 会把最终的解析工作代理给Number.ParseInt32;