乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      性能: TryParse比Parse好

       悟靜 2012-02-16

      TryParse比Parse好

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

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

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

      實際上,早期的FCL中并沒有提供TryParse方法,那時只能調用Parse方法,如果轉型失敗,則要將值設定為一個初始值,同時必須要捕獲異常,代碼如下所示:

      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ā)異常這個過程會對性能造成損耗(第5章會詳細解釋這一點)。微軟的開發(fā)團隊正是注意到這一點,所以從.NET 2.0開始,FCL中開始為基元類型提供TryParse方法。我們不妨來做個實驗,代碼如下所示:

      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 

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

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

      不過,我們并不建議為所有的類型都提供TryParse模式,只有在考慮到Do方法會帶來明顯的性能損耗時,才建議使用TryParse。

        本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
        轉藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約