2013年12月25日 星期三

[C#]Convert、Parse、TryParse 差異

上次介紹過Convert(轉型)與Int32(強制轉型)的差別、效能
※基本上強制轉型可以分成:
類型 Example
安全性轉型 is、as (參考MSDN)
強制性轉型 (資料型別)Object
效能上 as -> is -> 強制行轉型,
(有興趣的看倌可以參考DotBlogs)。
以上都不是小弟想說這篇的重點.....ToT
※至於轉型可以分成(Int32為範例):
類型 Example
Convert Convert.ToInt32("")
Parse Int32.Parse("")
TryParse Int32.TryParse("")
上述三種方式都可以進行轉型,
以下是小弟經過Google大神所整理的資料。

◎     差異性     ◎
差別就是在Exception的處理(如下,參考CodeProject)。

string s1 = "1234"; 
string s2 = "1234.65"; 
string s3 = null; 
string s4 = "123456789123456789123456789123456789123456789"; 
Case1. Convert:
result = Convert.ToInt32(s1); //-- 1234 
result = Convert.ToInt32(s2); //-- FormatException 
result = Convert.ToInt32(s3); //-- 0 
result = Convert.ToInt32(s4); //-- OverflowException 
Case2. Parse:
result = Int32.Parse(s1); //-- 1234 
result = Int32.Parse(s2); //-- FormatException 
result = Int32.Parse(s3); //-- ArgumentNullException 
result = Int32.Parse(s4); //-- OverflowException 
Case3. TryParse:
  bool success = false;    
 int result = 0; 
 success = Int32.TryParse(s1, out result); //-- success => true;  result => 1234 
 success = Int32.TryParse(s2, out result); //-- success => false; result => 0 
 success = Int32.TryParse(s3, out result); //-- success => false; result => 0 
 success = Int32.TryParse(s4, out result); //-- success => false; result => 0 
◎     效能比較     ◎
如果有做Exception的動作,
自然速度會較慢,
所以在這裡可以看出Parse效率優於Convert,
Convert效率優於TryParse,
口說無憑馬上來測試一下...(參考CodeProject)
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConvertParseTryParseDiff
{
    class Program
    {
        static void Main(string[] args)
        {
            Stopwatch sw = new Stopwatch();
            string s = "123456789";
            bool success = false;
            int result = 0;
            sw.Reset();
            sw.Start();
            for (int i = 0; i < 10000; i++)
            {
                result = Convert.ToInt32(s);
            }
            sw.Stop();
            Console.WriteLine("Convert spend time :{0} ms", sw.Elapsed.TotalMilliseconds.ToString());
            sw.Reset();
            sw.Start();
            for (int i = 0; i < 10000; i++)
            {
                result = Int32.Parse(s);
            }
            sw.Stop();
            Console.WriteLine("Parse spend time :{0} ms", sw.Elapsed.TotalMilliseconds.ToString());
            sw.Reset();
            sw.Start();
            for (int i = 0; i < 10000; i++)
            {
                success = Int32.TryParse(s, out result);
            }
            sw.Stop();
            Console.WriteLine("TryParse spend time :{0} ms", sw.Elapsed.TotalMilliseconds.ToString());
            Console.ReadKey();
        }
    }
}
【Result】

沒有留言:

張貼留言