小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

性能: TryParse比Parse好

 悟靜 2012-02-16

TryParse比Parse好

如果注意觀察除string外的所有基元類型,會(huì)發(fā)現(xiàn)它們都有兩個(gè)將字符串轉(zhuǎn)型為本身的方法:Parse和TryParse。以類型double為例,這兩個(gè)方法最簡(jiǎn)單的原型為:

  1. 1.public static double Parse(string s)  
  2. 2.public static bool TryParse(string s, out double result) 

兩者最大的區(qū)別是,如果字符串格式不滿足轉(zhuǎn)換的要求,Parse方法將會(huì)引發(fā)一個(gè)異常;TryParse方法則不會(huì)引發(fā)異常,它會(huì)返回false,同時(shí)將result置為0。

實(shí)際上,早期的FCL中并沒(méi)有提供TryParse方法,那時(shí)只能調(diào)用Parse方法,如果轉(zhuǎn)型失敗,則要將值設(shè)定為一個(gè)初始值,同時(shí)必須要捕獲異常,代碼如下所示:

  1. string str = null;  
  2. double d;  
  3. try  
  4. {  
  5.     d = Double.Parse(str);  
  6. }  
  7. catch (Exception ex)  
  8. {  
  9.     d = 0;  

要注意,引發(fā)異常這個(gè)過(guò)程會(huì)對(duì)性能造成損耗(第5章會(huì)詳細(xì)解釋這一點(diǎn))。微軟的開(kāi)發(fā)團(tuán)隊(duì)正是注意到這一點(diǎn),所以從.NET 2.0開(kāi)始,F(xiàn)CL中開(kāi)始為基元類型提供TryParse方法。我們不妨來(lái)做個(gè)實(shí)驗(yàn),代碼如下所示:

  1. double re;  
  2. long ticks;  
  3.  
  4. Stopwatch sw = Stopwatch.StartNew();  
  5. for (int i = 1; i < 1000; i++)  
  6. {  
  7.     try  
  8.     {  
  9.         re = double.Parse("123");  
  10.     }  
  11.     catch  
  12.     {  
  13.         re = 0;  
  14.     }  
  15. }  
  16. sw.Stop();  
  17. ticks = sw.ElapsedTicks;  
  18. Console.WriteLine("double.Parse() 成功,{0} ticks", ticks);  
  19.  
  20. sw = Stopwatch.StartNew();  
  21. for (int i = 1; i < 1000; i++)  
  22. {  
  23.     if (double.TryParse("123", out re) == false)  
  24.     {  
  25.         re = 0;  
  26.     }  
  27. }  
  28. sw.Stop();  
  29. ticks = sw.ElapsedTicks;  
  30. Console.WriteLine("double.TryParse() 成功,{0} ticks", ticks);  
  31.  
  32. sw = Stopwatch.StartNew();  
  33. for (int i = 1; i < 1000; i++)  
  34. {  
  35.     try  
  36.     {  
  37.         re = double.Parse("aaa");  
  38.     }  
  39.     catch  
  40.     {  
  41.         re = 0;  
  42.     }  
  43. }  
  44. sw.Stop();  
  45. ticks = sw.ElapsedTicks;  
  46. Console.WriteLine("double.Parse() 失敗,{0} ticks", ticks);  
  47.  
  48. sw = Stopwatch.StartNew();  
  49. for (int i = 1; i < 1000; i++)  
  50. {  
  51.     if (double.TryParse("aaa", out re) == false)  
  52.     {  
  53.         re = 0;  
  54.     }  
  55. }  
  56. sw.Stop();  
  57. ticks = sw.ElapsedTicks;  
  58. Console.WriteLine("double.TryParse() 失敗,{0} ticks", ticks); 

以上這段代碼的輸出為:

  1. double.Parse() 成功,6661 ticks  
  2. double.TryParse() 成功,2886 ticks  
  3. double.Parse() 失敗,2062347 ticks  
  4. double.TryParse() 失敗,3379 ticks 

可見(jiàn), Parse和TryParse方法如果執(zhí)行成功,它們的效率在一個(gè)數(shù)量級(jí)上,甚至在本示例中(在一個(gè)循環(huán)內(nèi)),TryParse所帶來(lái)的效率比Parse還要高一些。但若執(zhí)行失敗,Parse的執(zhí)行效率相比于TryParse就太低了。

我們將提供TryParse方法的這種行為叫做類型提供TryParse模式。TryParse模式為類型提供兩個(gè)方法,假設(shè)第一個(gè)方法聲明為Do,第二個(gè)方法則聲明為TryDo。Do方法在執(zhí)行過(guò)程中如果發(fā)生錯(cuò)誤則引發(fā)異常,而TryDo方法會(huì)返回一個(gè)boolean值,方法執(zhí)行失敗返回false。如果要從TryDo中獲取實(shí)際的返回值,則應(yīng)該為方法提供out參數(shù)。

不過(guò),我們并不建議為所有的類型都提供TryParse模式,只有在考慮到Do方法會(huì)帶來(lái)明顯的性能損耗時(shí),才建議使用TryParse。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多