.NET架構-Try-Parse和Tester-Doer的使用區別

來源:互聯網
上載者:User

Parse和TryParse

  DateTime中Parse(string s)和TryParse(string s, out datetime)都是用來將字元型的日期時間轉化為等效的System.DateTime。那麼,他們之間有沒有區別呢,除了函數的參數不同外。先看下代碼:

            string dateTimeStr = "";            DateTime dt = DateTime.Parse(dateTimeStr);

  運行Null 字元串,將其轉化為日期時間型,顯然不能轉化,並且Parse()會拋出一個異常: System.FormatException: s 中不包含日期和時間的有效字串表示形式。但是,運行TryParse這個轉化方法:

            string dateTimeStr = "";                   DateTime dt2; //dt2未經初始化,就被傳遞給函數TryParse()            bool sucflag = DateTime.TryParse(dateTimeStr, out dt2);

  轉化首先是不拋出異常的,dt2被賦值為日期時間的最小值,sucflag為false。看下對函數的注釋:

當此方法返回時,如果轉換成功,則包含與 s 中包含的日期和時間等效的 System.DateTime 值;如果轉換失敗,則為 System.DateTime.MinValue。如果s 參數為 null,是Null 字元串 (“”) 或者不包含日期和時間的有效字串表示形式,則轉換失敗。*該參數未經初始化即被傳遞。這個函數是不會拋出任何異常的。

Try-Parse

  看到他們的不同後,進一步來講,parse()拋出異常必然影響效能,TryParse()未拋出任何異常,這是一種最佳化異常效能的設計模式,稱為Try-Parse Pattern。以下是微軟的官方解釋:

For extremely performance-sensitive APIs, an even faster pattern than the Tester-Doer Pattern described in the previous section should be used. The pattern calls for adjusting the member name to make a well-defined test case a part of the member semantics. For example, DateTime defines a Parse method that throws an exception if parsing of a string fails. It also defines a corresponding TryParse method that attempts to parse, but returns false if parsing is unsuccessful and returns the result of a successful parsing using an out parameter.

Tester-Doer

  在解釋Try-Parse模式時,微軟提出了另外一種模式:Tester-Doer模式,什麼是Tester-Doer模式呢? 函數中寫入異常,會降低效能,微軟給出了這種模式來減小異常帶來的副作用。
 
  如下代碼:

ICollection<int> numbers = 省略擷取資料的邏輯numbers.Add(1);//Add此處不做可寫性檢查

  以上缺陷:假如集合是唯讀,方法Add會拋出異常。調用這個方法的地方會經常拋出異常,因此會影響系統的效能。為了避免這個設計缺陷,微軟提出: Sometimes performance of an exception-throwing member can be improved by breaking the member into two.

  將Add()分解為:

ICollection<int> numbers = 省略擷取資料的邏輯if(!numbers.IsReadOnly) //Tester{    numbers.Add(1); //Doer}

  Tester-Doer模式 總結:

The member used to test a condition, which in our example is the property IsReadOnly, is referred to as the tester. The member used to perform a potentially throwing operation, the Add method in our example, is referred to as the doer.

   分解後,先做唯讀性檢測,這樣會減少Add拋出唯讀性異常的次數,提升效能。

總結
  Try-Parse Pattern和Tester-Doer模式是兩種替代拋異常的最佳化方式,起到最佳化設計效能的作用。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.