这2个方法都可以把把string解析为int,那么我们一定会有疑问:到底他们有什么区别?什么时候该用什么?性能如何等等。
其实在2.0里还有Int32.TryParse也实现了同样的效果。
Convert.ToInt32与Int32.Parse的恩恩怨怨_c#using System;
Convert.ToInt32与Int32.Parse的恩恩怨怨_c#
using System.Collections.Generic;
Convert.ToInt32与Int32.Parse的恩恩怨怨_c#
using System.Text;
Convert.ToInt32与Int32.Parse的恩恩怨怨_c#
Convert.ToInt32与Int32.Parse的恩恩怨怨_c#
namespace ConsoleApplication1
Convert.ToInt32与Int32.Parse的恩恩怨怨_休闲_06
{
Convert.ToInt32与Int32.Parse的恩恩怨怨_休闲_08    
class Program
Convert.ToInt32与Int32.Parse的恩恩怨怨_休闲_09    
{
Convert.ToInt32与Int32.Parse的恩恩怨怨_休闲_08        
static void Main(string[] args)
Convert.ToInt32与Int32.Parse的恩恩怨怨_类型_12        
{
Convert.ToInt32与Int32.Parse的恩恩怨怨_休闲_08            
string myString = "1234";
Convert.ToInt32与Int32.Parse的恩恩怨怨_休闲_08            
int myint = 0;
Convert.ToInt32与Int32.Parse的恩恩怨怨_休闲_08
Convert.ToInt32与Int32.Parse的恩恩怨怨_休闲_08            myint 
= Convert.ToInt32(myString);
Convert.ToInt32与Int32.Parse的恩恩怨怨_休闲_08            Console.Write(myint
+"\r\n ");
Convert.ToInt32与Int32.Parse的恩恩怨怨_休闲_08
Convert.ToInt32与Int32.Parse的恩恩怨怨_休闲_08            myint 
= Int32.Parse(myString);
Convert.ToInt32与Int32.Parse的恩恩怨怨_休闲_08            Console.Write(myint
+"\r\n ");
Convert.ToInt32与Int32.Parse的恩恩怨怨_休闲_08
Convert.ToInt32与Int32.Parse的恩恩怨怨_休闲_08            Int32.TryParse(myString, 
out myint);
Convert.ToInt32与Int32.Parse的恩恩怨怨_休闲_08            Console.Write(myint
+"\r\n");
Convert.ToInt32与Int32.Parse的恩恩怨怨_休闲_08
Convert.ToInt32与Int32.Parse的恩恩怨怨_职场_26        }

Convert.ToInt32与Int32.Parse的恩恩怨怨_职场_26    }

Convert.ToInt32与Int32.Parse的恩恩怨怨_休闲_28}
 Convert.ToInt32与Int32.Parse的恩恩怨怨_休闲_29
表面上看,可见3个方法都实现了同样的效果!
那么我们把代码改一下:
            //string myString = "1234";
            string myString = null;
            int myint = 0;
            myint = Convert.ToInt32(myString);
            Console.Write(myint+"\r\n");
            myint = Int32.Parse(myString);
            Console.Write(myint+"\r\n");
            Int32.TryParse(myString, out myint);
            Console.Write(myint+"\r\n");
这次字符串是null,那么运行结果会怎样呢?
Convert.ToInt32与Int32.Parse的恩恩怨怨_类型_30
这是因为如果解析错误:
Convert.ToInt32()null时不抛异常而是返回0;
Int32.Parse()抛异常
Int32.TryParse()不抛异常,会返回true或false来说明解析是否成功,如果解析错误,调用方将会得到0值。
由于Convert.ToInt32()在null时我们看不到Int32.TryParse()的运行结果所以再分调试和不调试来看结果的差异:
调试:
Convert.ToInt32与Int32.Parse的恩恩怨怨_类型_31
不调试:
Convert.ToInt32与Int32.Parse的恩恩怨怨_职场_32
其实一般出bug毕竟属于少数,而且大家都会测试保证不出bug,那么我们最关心的或许就是性能。
再把代码修改一下:
2
Convert.ToInt32与Int32.Parse的恩恩怨怨_c#            string myString1 = "1234";
Convert.ToInt32与Int32.Parse的恩恩怨怨_c#            
//string myString = null;//清清月儿 [url]http://blog.csdn.net/21aspnet/[/url]
Convert.ToInt32与Int32.Parse的恩恩怨怨_c#
            int myint = 0;
Convert.ToInt32与Int32.Parse的恩恩怨怨_c#            Console.Write(System.DateTime.Now.ToString()
+"  "+System.DateTime.Now.Millisecond.ToString() + " ");
Convert.ToInt32与Int32.Parse的恩恩怨怨_c#            
for (int i = 0; i < 1000000;i++ )
Convert.ToInt32与Int32.Parse的恩恩怨怨_职场_38            
{
Convert.ToInt32与Int32.Parse的恩恩怨怨_休闲_08                myint 
= Convert.ToInt32(myString1);
Convert.ToInt32与Int32.Parse的恩恩怨怨_休闲_28            }

Convert.ToInt32与Int32.Parse的恩恩怨怨_c#            Console.Write(myint 
+ " \r\n");
Convert.ToInt32与Int32.Parse的恩恩怨怨_c#            Console.Write(System.DateTime.Now.ToString() 
+ "  " + System.DateTime.Now.Millisecond.ToString() + "\r\n ");
Convert.ToInt32与Int32.Parse的恩恩怨怨_c#
Convert.ToInt32与Int32.Parse的恩恩怨怨_c#
Convert.ToInt32与Int32.Parse的恩恩怨怨_c#            
string myString2 = "1234";
Convert.ToInt32与Int32.Parse的恩恩怨怨_c#            
for (int i = 0; i < 1000000; i++)
Convert.ToInt32与Int32.Parse的恩恩怨怨_类型_48            
{
Convert.ToInt32与Int32.Parse的恩恩怨怨_休闲_08                myint 
= Int32.Parse(myString2);
Convert.ToInt32与Int32.Parse的恩恩怨怨_休闲_28            }

Convert.ToInt32与Int32.Parse的恩恩怨怨_c#            Console.Write(myint 
+ "\r\n ");
Convert.ToInt32与Int32.Parse的恩恩怨怨_c#            Console.Write(System.DateTime.Now.ToString() 
+ "  " + System.DateTime.Now.Millisecond.ToString() + " ");
Convert.ToInt32与Int32.Parse的恩恩怨怨_c#
Convert.ToInt32与Int32.Parse的恩恩怨怨_c#            
string myString3 = "1234";
Convert.ToInt32与Int32.Parse的恩恩怨怨_c#            
for (int i = 0; i < 1000000; i++)
Convert.ToInt32与Int32.Parse的恩恩怨怨_休闲_57            
{
Convert.ToInt32与Int32.Parse的恩恩怨怨_休闲_08                Int32.TryParse(myString3, 
out myint);
Convert.ToInt32与Int32.Parse的恩恩怨怨_休闲_28            }

Convert.ToInt32与Int32.Parse的恩恩怨怨_c#            Console.Write(myint 
+ "\r\n ");
Convert.ToInt32与Int32.Parse的恩恩怨怨_c#            Console.Write(System.DateTime.Now.ToString() 
+ "  " + System.DateTime.Now.Millisecond.ToString() + "\r\n ");
Convert.ToInt32与Int32.Parse的恩恩怨怨_c#
 
我们让3个方法执行100万次转换毫秒差异:
Convert.ToInt32与Int32.Parse的恩恩怨怨_休闲_64
为了准确多做几次测试:
第二次
Convert.ToInt32与Int32.Parse的恩恩怨怨_休闲_65
第三次
Convert.ToInt32与Int32.Parse的恩恩怨怨_职场_66
  第一次 第二次 第三次
Convert.ToInt32() 532-204=328 1163-750=413 782-469=313
Int32.Parse() 844-532=312 360-63=297 1094-782=312
Int32.TryParse() 1141-844=297 657-360=297 375-94=281
其实我们可以得出结论:
3个方法几乎没有差异!
如果真要追求完美那么性能的差异是:Int32.TryParse()优于Int32.Parse()优于Convert.ToInt32()。
所以个人建议:.NET1.1下用Int32.Parse();.NET2.0用Int32.TryParse()。
那么为什么会这样呢?
其实这些数据不是偶然的,因为:
Convert.ToInt32 会把最终的解析工作代理给 Int32.Parse;
Int32.Parse 会把最终的解析工作代理给Number.ParseInt32;
Int32.TryParse 会把最终的解析工作代理给Number.TryParseInt32。
至于其他进制的转换请参考MSDN。重载参数即可!