2013-07-06 28 views
4

我經常看到在C#這樣的方法:(這樣做,可能會或可能不會給結果的計算)帶有「out」參數的TryXXX-like方法vs返回一個可爲null的值類型?

bool TrySomething(SomeType inputData, out SomeOtherType result) { ... } 

爲什麼人們不使用,而不是這樣呢?

Nullable<SomeOtherType> TrySomething(SomeType inputData) { ... } 

它只是表現差異? 這是一個struct,所以不應該有堆分配,對吧? 或者我錯過了什麼?

+1

有時'null'是一個有效的值,而不是失敗的跡象......? –

+0

特別是在int.TryParse,DateTime.TryParse和其他 –

+0

的情況下@JoachimIsaksson想到了這一點,但是那麼這也可以反映在SomeOtherType的類型中?例如,我們可以用'Nullable '替換SomeOtherType。 –

回答

1

Nullable在C#2.0中引入 - 就像泛型一樣。有很多代碼早於此。

說實話,我不是一個只要返回一個Nullable就會發生什麼問題的人。

你平時有像

SomeOtherType Something(SomeType inputData) { ... } 

的方法,如果出現錯誤,將拋出異常。現在在某些情況下,你想避免一個例外,所以有一種替代方法:你給的那個。

bool TrySomething(SomeType inputData, out SomeOtherType result) { ... } 

但是,出現錯誤的異常是精確的,布爾值不是。所以,如果它給你false,你有更多的信息,「它沒有工作」。在某些情況下,這可能就足夠了。我喜歡區分「我的收藏不包含那個價值」錯誤,從「我目前內存不足,無法再做任何事」錯誤或其他任何其他錯誤。

現在引入Nullable的返回值,它是 - 我稱之爲 - 德魯伊的知識,知道接收null並不意味着「值爲null」,而是「出現了錯誤」。這是您需要記錄和解釋的事情,而方法的bool結果是不言自明的。

簡而言之,您只能通過使用Nullable作爲返回值而產生稍微更混亂的代碼。

+0

絕對沒有什麼。當使用'out'參數時,你必須首先聲明一個變量來存儲結果。 –

+0

當使用'Nullable'方法結果時,您需要將它存儲在一個變量中,在使用之前檢查它是否爲'null'。沒有增加。 –

+0

存在空合併運算符,有時可以簡化此操作。另外,分配是用1條語句完成的,而不是2. –

相關問題