.NET框架-Try-Parse和Tester-Doer
作者:vuefine
文獻(xiàn): msdn library
平臺(tái):.NET 2.0+
Parse和TryParse
DateTime中Parse(string s)和TryParse(string s, out datetime)都是用來將字符型的日期時(shí)間轉(zhuǎn)化為等效的System.DateTime。那么,他們之間有沒有區(qū)別呢,除了函數(shù)的參數(shù)不同外。先看下代碼:
string dateTimeStr = "";DateTime dt = DateTime.Parse(dateTimeStr);運(yùn)行空字符串,將其轉(zhuǎn)化為日期時(shí)間型,顯然不能轉(zhuǎn)化,并且Parse()會(huì)拋出一個(gè)異常: System.FormatException: s 中不包含日期和時(shí)間的有效字符串表示形式。但是,運(yùn)行TryParse這個(gè)轉(zhuǎn)化方法:
string dateTimeStr = ""; DateTime dt2; //dt2未經(jīng)初始化,就被傳遞給函數(shù)TryParse()bool sucflag = DateTime.TryParse(dateTimeStr, out dt2);轉(zhuǎn)化首先是不拋出異常的,dt2被賦值為日期時(shí)間的最小值,sucflag為false。看下對(duì)函數(shù)的注釋:
當(dāng)此方法返回時(shí),如果轉(zhuǎn)換成功,則包含與 s 中包含的日期和時(shí)間等效的 System.DateTime 值;如果轉(zhuǎn)換失敗,則為 System.DateTime.MinValue。如果s 參數(shù)為 null,是空字符串 (“”) 或者不包含日期和時(shí)間的有效字符串表示形式,則轉(zhuǎn)換失敗。*該參數(shù)未經(jīng)初始化即被傳遞。這個(gè)函數(shù)是不會(huì)拋出任何異常的。
Try-Parse
看到他們的不同后,進(jìn)一步來講,parse()拋出異常必然影響性能,TryParse()未拋出任何異常,這是一種優(yōu)化異常性能的設(shè)計(jì)模式,稱為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模式時(shí),微軟提出了另外一種模式:Tester-Doer模式,什么是Tester-Doer模式呢? 函數(shù)中寫入異常,會(huì)降低性能,微軟給出了這種模式來減小異常帶來的副作用。
如下代碼:
以上缺陷:假如集合是只讀的,方法Add會(huì)拋出異常。調(diào)用這個(gè)方法的地方會(huì)經(jīng)常拋出異常,因此會(huì)影響系統(tǒng)的性能。為了避免這個(gè)設(shè)計(jì)缺陷,微軟提出: Sometimes performance of an exception-throwing member can be improved by breaking the member into two.
將Add()分解為:
ICollection<int> numbers = 省略獲取數(shù)據(jù)的邏輯 if(!numbers.IsReadOnly) //Tester {numbers.Add(1); //Doer }Tester-Doer模式 總結(jié):
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.
分解后,先做只讀性檢測(cè),這樣會(huì)減少Add拋出只讀性異常的次數(shù),提升性能。
總結(jié)
Try-Parse Pattern和Tester-Doer模式是兩種替代拋異常的優(yōu)化方式,起到優(yōu)化設(shè)計(jì)性能的作用。
總結(jié)
以上是生活随笔為你收集整理的.NET框架-Try-Parse和Tester-Doer的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu18.04+python3.
- 下一篇: Apollo 的3D障碍物感知解析