C#优化字符串操作(1)--Convert.ToInt32与Int32.Parse的恩恩怨怨

                C#优化字符串操作

1.Convert.ToInt32与Int32.Parse的恩恩怨怨

1.Convert.ToInt32Int32.Parse的恩恩怨怨

这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
+"  ");

            myint 
= Int32.Parse(myString);
            Console.Write(myint
+"  ");

            Int32.TryParse(myString, 
out myint);
            Console.Write(myint
+" ");

        }

    }

}

 

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

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

不调试:

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

再把代码修改一下:

   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 
+   "   " );
            Console.Write(System.DateTime.Now.ToString() 
+   "    "   +  System.DateTime.Now.Millisecond.ToString()  +   "   " );


            
string  myString2  =   " 1234 " ;
            
for  ( int  i  =   0 ; i  <   1000000 ; i ++ )
            ...
{
                myint 
= Int32.Parse(myString2);
            }

            Console.Write(myint 
+   "   " );
            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 
+   "   " );
            Console.Write(System.DateTime.Now.ToString() 
+   "    "   +  System.DateTime.Now.Millisecond.ToString()  +   "   " );

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

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

第三次

 第一次第二次第三次
Convert.ToInt32()532-204=3281163-750=413782-469=313
Int32.Parse()844-532=312360-63=2971094-782=312
Int32.TryParse()1141-844=297657-360=297375-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。重载参数即可!


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值