[C#][Tips]比較Int32.TryParse、Int32.Parse And Convert.ToInt32
今天被朋友問了Int32.TryParse Int32.Parse 和Convert.ToInt32到底差在那裏
一時間無法很明確說出差異,所以再參考MSDN後就記錄下來。
MSDN解釋如下
Int32.TryParse:將數字的字串表示轉換成它的對等 32 位元帶正負號的整數。傳回指示轉換是否成功的值。
Int32.Parse:將數字的字串表示轉換成它的對等 32 位元帶正負號的整數。
Convert.ToInt32:將數字的指定 String 表示轉換為相等的 32 位元帶正負號的整數。
雖然三種方法都是將內容轉換為相等的32位元帶正負號整數
但結果會因為資料不同而大不同,這裡簡單測試記錄。
String data = "123456";
Int32 myint = 0;
Int32.TryParse(data,out myint);
Console.Write(myint + "\r\n");
myint = Int32.Parse(data);
Console.Write(myint + "\r\n");
myint = Convert.ToInt32(data);
Console.Write(myint + "\r\n");
Console.ReadLine();
得到相同的結果(預料中)
改一下資料(data=””)
String data = "";
Int32 myint = 0;
Int32.TryParse(data,out myint);
Console.Write(myint + "\r\n");
myint = Int32.Parse(data);
Console.Write(myint + "\r\n");
myint = Convert.ToInt32(data);
Console.Write(myint + "\r\n");
Console.ReadLine();
結果:Int32.TryParse回傳0(false),但Int32.Parse和Convert.ToInt32都會發生格式錯誤的Exception
再改一下資料(data=null)
String data = null;
Int32 myint = 0;
Int32.TryParse(data,out myint);
Console.Write(myint + "\r\n");
myint = Convert.ToInt32(data);
Console.Write(myint + "\r\n");
myint = Int32.Parse(data);
Console.Write(myint + "\r\n");
Console.ReadLine();
結果:Int32.TryParse和Convert.ToInt32都回傳0,Int32.Parse依然發生Exception
由於TryParse型別為bool所以不會拋出任何Exception,只會回傳true(1)或false(0)表式解析是否成功。
Convert.ToInt32型別雖然是int但是遇到null會返回0。
Int32.Parse都會拋出Exception
接下來測試這三種再解析效能如何(測試5次取平均)
String data = "123456";
Int32 myint = 0;
Stopwatch sw = new Stopwatch();
sw.Reset();
sw.Start();
for (Int32 i = 0; i < 500000; i++)
{
Int32.TryParse(data, out myint);
}
sw.Stop();
Console.Write(myint + "_Int32.TryParse時間:" + sw.ElapsedMilliseconds.ToString() + "\r\n");
sw.Reset();
sw.Start();
for (Int32 i = 0; i < 500000; i++)
{
myint = Convert.ToInt32(data);
}
sw.Stop();
Console.Write(myint + "_Convert.ToInt32時間:"+sw.ElapsedMilliseconds.ToString()+"\r\n");
sw.Reset();
sw.Start();
for (Int32 i = 0; i < 500000; i++)
{
myint = Int32.Parse(data);
}
sw.Stop();
Console.Write(myint + "_Int32.TryParse時間:" + sw.ElapsedMilliseconds.ToString() + "\r\n");
Console.ReadLine();
第一次
第二次
第三次
第四次
第五次
總表
Int32.TryParse平均 | Convert.ToInt32平均 | Int32.Parse平均 |
192.6 | 195.4 | 195.4 |
看來三種方法其實都差不多。但Int32.TryParse似乎比較好(保哥說明:Exception cost較其他兩種方法低)。
而Convert.ToInt32和Int32.Parse相同其實也是可理解的,因為Convert.ToInt32最終會由Int32.Parse來處理
MSDN備註傳回值是在 value 上叫用 Int32..::.Parse 方法的結果