這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");
}
}
}
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;
string myString = null;
int myint = 0;
myint = Convert.ToInt32(myString);
Console.Write(myint+"\r\n");
Console.Write(myint+"\r\n");
myint = Int32.Parse(myString);
Console.Write(myint+"\r\n");
Console.Write(myint+"\r\n");
Int32.TryParse(myString, out myint);
Console.Write(myint+"\r\n");
這次字符串是null,那麼運行結果會怎樣呢?
Console.Write(myint+"\r\n");
這次字符串是null,那麼運行結果會怎樣呢?
這是因爲如果解析錯誤:
Convert.ToInt32()在null時不拋異常而是返回0;
Int32.Parse()要拋異常;
Int32.TryParse()不拋異常,會返回true或false來說明解析是否成功,如果解析錯誤,調用方將會得到0值。
Convert.ToInt32()在null時不拋異常而是返回0;
Int32.Parse()要拋異常;
Int32.TryParse()不拋異常,會返回true或false來說明解析是否成功,如果解析錯誤,調用方將會得到0值。
由於Convert.ToInt32()在null時我們看不到Int32.TryParse()的運行結果所以再分調試和不調試來看結果的差異:
調試:
調試:
不調試:
其實一般出bug畢竟屬於少數,而且大家都會測試保證不出bug,那麼我們最關心的或許就是性能。
再把代碼修改一下:
2
2
string myString1 = "1234";
//string myString = null;//清清月兒 [url]http://blog.csdn.net/21aspnet/[/url]
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 ");
//string myString = null;//清清月兒 [url]http://blog.csdn.net/21aspnet/[/url]
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.0用Int32.TryParse()。
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。
其實這些數據不是偶然的,因爲:
Convert.ToInt32 會把最終的解析工作代理給 Int32.Parse;
Int32.Parse 會把最終的解析工作代理給Number.ParseInt32;
Int32.TryParse 會把最終的解析工作代理給Number.TryParseInt32。
至於其他進制的轉換請參考MSDN。重載參數即可!