.NET框架-Try-Parse和Tester-Doer
作者:vuefine
文獻: msdn library
平臺:.NET 2.0+
Parse和TryParse
DateTime中Parse(string s)和TryParse(string s, out datetime)都是用來將字符型的日期時間轉化為等效的System.DateTime。那么,他們之間有沒有區別呢,除了函數的參數不同外。先看下代碼:
string dateTimeStr = "";DateTime dt = DateTime.Parse(dateTimeStr);運行空字符串,將其轉化為日期時間型,顯然不能轉化,并且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,是空字符串 (“”) 或者不包含日期和時間的有效字符串表示形式,則轉換失敗。*該參數未經初始化即被傳遞。這個函數是不會拋出任何異常的。
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模式呢? 函數中寫入異常,會降低性能,微軟給出了這種模式來減小異常帶來的副作用。
如下代碼:
以上缺陷:假如集合是只讀的,方法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模式是兩種替代拋異常的優化方式,起到優化設計性能的作用。
總結
以上是生活随笔為你收集整理的.NET框架-Try-Parse和Tester-Doer的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu18.04+python3.
- 下一篇: Modern UI for WPF的使用