Convert.ToInt32与Int32.Parse

            Convert.ToInt32Int32.Parse的恩恩怨怨

本文转自 清清月儿  blog http://blog.csdn.net/21aspnet

2个方法都可以把把string解析为int,那么我们一定会有疑问:到底他们有什么区别?什么时候该用什么?性能如何等等。

其实在2.0里还有Int32.TryParse也实现了同样的效果。

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
...{
    
class Program
    
...{
        
static void Main(string[] args)
        
...{
            
string myString = "1234";
            
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");

        }
    }
}

 

表面上看,可见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()null时不抛异常而是返回0
Int32.Parse()抛异常
Int32.TryParse()不抛异常,会返回truefalse来说明解析是否成功,如果解析错误,调用方将会得到0值。

由于Convert.ToInt32()null时我们看不到Int32.TryParse()的运行结果所以再分调试和不调试来看结果的差异:
调试:

不调试:

其实一般出bug毕竟属于少数,而且大家都会测试保证不出bug,那么我们最关心的或许就是性能。

再把代码修改一下:
2

            string myString1 = "1234";
            
//string myString = null;//清清月儿 http://blog.csdn.net/21aspnet/
            int myint = 0;
            Console.Write(System.DateTime.Now.ToString()+"  "+System.DateTime.Now.Millisecond.ToString() + " ");
            
for (int i = 0; i < 1000000;i++ )
            
...{
                myint = Convert.ToInt32(myString1);
            }
            Console.Write(myint + " /r/n");
            Console.Write(System.DateTime.Now.ToString() + "  " + System.DateTime.Now.Millisecond.ToString() + "/r/n ");


            
string myString2 = "1234";
            
for (int i = 0; i < 1000000; i++)
            
...{
                myint = Int32.Parse(myString2);
            }
            Console.Write(myint + "/r/n ");
            Console.Write(System.DateTime.Now.ToString() + "  " + System.DateTime.Now.Millisecond.ToString() + " ");

            
string myString3 = "1234";
            
for (int i = 0; i < 1000000; i++)
            
...{
                Int32.TryParse(myString3, 
out myint);
            }
            Console.Write(myint + "/r/n ");
            Console.Write(System.DateTime.Now.ToString() + "  " + System.DateTime.Now.Millisecond.ToString() + "/r/n ");

 

我们让3个方法执行100万次转换毫秒差异:

为了准确多做几次测试:
第二次

第三次

 

第一次

第二次

第三次

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.0Int32.TryParse()

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

至于其他进制的转换请参考MSDN重载参数即可!

 

发布了22 篇原创文章 · 获赞 2 · 访问量 5万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览