一 使用TryParse,而不是Parse 除string外的所有基元類型,都有兩個將string類型轉型為其本身類型的方法:Parse 和 TryParse。 以double類型為例,這兩個方法最簡單的原型為: public static Double Parse(string s); publi ...
一 使用TryParse,而不是Parse
除string外的所有基元類型,都有兩個將string類型轉型為其本身類型的方法:Parse 和 TryParse。
以double類型為例,這兩個方法最簡單的原型為:
public static Double Parse(string s); public static bool TryParse(string s, out Double result);
兩者最大的區別是:如果字元串不滿足轉換的要求,Parse方法將引發一個異常。TryParse方法不會引發異常,它會返回false,同時將result置為0。
調用Parse方法,如果轉型失敗,則要將值設定為一個初始值,同時必須要捕獲異常:
var str = string.Empty; double d; try { d = double.Parse(str); } catch (Exception ex) { d = 0; }
而引發異常這個過程會對性能造成損耗。
從 .Net 2.0 開始,FCL開始對基元類型提供TryParse方法。
下例對Parse和TryParse做個實驗對比:
double result; var sw = Stopwatch.StartNew(); for (int i = 0; i < 1000; i++) { try { result = double.Parse("123"); } catch { result = 0; } } sw.Stop(); Console.WriteLine($"Parse Success, {sw.ElapsedTicks} ticks"); sw = Stopwatch.StartNew(); for (int i = 0; i < 1000; i++) { if (double.TryParse("123", out result) == false) { result = 0; } } sw.Stop(); Console.WriteLine($"TryParse Success, {sw.ElapsedTicks} ticks"); sw = Stopwatch.StartNew(); for (int i = 0; i < 1000; i++) { try { result = double.Parse("abc"); } catch { result = 0; } } sw.Stop(); Console.WriteLine($"Parse Failed, {sw.ElapsedTicks} ticks"); sw = Stopwatch.StartNew(); for (int i = 0; i < 1000; i++) { if (double.TryParse("abc", out result) == false) { result = 0; } } sw.Stop(); Console.WriteLine($"TryParse Failed, {sw.ElapsedTicks} ticks");
輸出:
Parse Success, 3663 ticks
TryParse Success, 910 ticks
Parse Failed, 13685860 ticks
TryParse Failed, 716 ticks
可見,TryParse的執行效率高於Parse。