2012-02-29 19 views
13

有點這個question,詢問有關out參數的行爲,但更集中,爲什麼這些TryParse方法使用out,而不是ref的背面。爲什麼的TryParse方法使用一個輸出參數,而不是一個裁判

在解析之前,您確實想要爲參數初始化一個值,並在解析失敗時保留該值,但並不真正關心它是否失敗。但由於out參數的值重置。

這種情況可能是這樣的......

int arg = 123; 
Int32.TryParse(someString, ref arg); 

但是因爲out參數,我們必須把它寫這樣的,這是比較詳細的...

int arg; 
if(!Int32.TryParse(someString, out arg) 
{ 
    arg = 123; 
} 

我知道的知道解析失敗可能是非常有用的,但使用ref並不排除這一點。

那麼爲什麼這些TryParse方法使用out而不是ref

+2

此外,爲什麼沒有'T TryParse(字符串值)',如果解析失敗就返回'default(T)'? – 2012-02-29 01:03:55

+0

@BennorMcCarthy:因爲你無法區分'「0」'和'「o」'。 – SLaks 2012-02-29 01:05:37

+2

@BennorMcCarthy:因爲那麼你不能區分這兩者:「0」(成功解析爲0)和「蘋果」(解析失敗,默認爲0)。 – 2012-02-29 01:06:15

回答

13

因爲正常使用模式與您所描述的完全相反。

人們應該能夠編寫

int arg; 
if (!Int32.TryParse(someString, ref arg)) { 
    Waaah; 
} 

只好TryParse採取了ref參數,這將需要一個無用的初始化。

真正的問題是爲什麼沒有int? int.TryParse(string)方法。

+0

@SLaks ... true,true考慮到它被添加到支持可空類型的.net2.0中。至於無用的初始化有效點。也許框架可以支持int? ref和out重載。 ahhh – aqwert 2012-02-29 01:19:10

+0

你答案的最後部分正是我所掌握的。一個可爲空的返回值將解決違約問題,同時如果需要仍然提供相同數量的信息。它感覺真的很笨重,不得不聲明一個變量用作out參數。 – 2012-02-29 02:31:50

+1

我認爲答案可能只是TryParse的現有模式早於泛型,因此不可選Nullable 。 – 2012-02-29 02:34:55

5

您使用out來指示參數未被使用,僅設置。來電者是需要分配方法返回前值:

int n; 
if (Int32.TryParse("47", out n)) { // Works fine; `n` will be set to the 
    // ..       // result of the parse. 
} 

如果使用ref,你就必須初始化事前的價值,這是愚蠢的,因爲它會無論如何都要覆蓋:

int n; 
if (Int32.TryParse("47", ref n)) { // Kablammo! `n` isn't initialized. 
    // .. 
} 

這正是TryParse的要點:您保證在代表解析嘗試輸出的out參數中有一個值。 true或false的返回值表示您是應該關心結果還是忽略結果。

+0

從語義上講,TryXXX意味着它會嘗試做一些事情......如果它失敗了,那麼應該不會被修改和知道關於失敗就夠了。在這種情況下,我期望一個ref參數,並顯式初始化arg到我想要的。儘管@SLaks指出在大多數情況下這是不必要的 – aqwert 2012-02-29 01:22:53

+0

「如果失敗了,那麼應該不要修改並知道失敗就足夠了」 - 這隻有在大多數人希望解析的結果爲默認值到零以外的東西。如果這是真的,那麼整數的'default(T)'不應該爲零。但它是,所以你所要求的是一個矛盾。 – 2012-02-29 01:26:13

3

這是因爲參數out更適合該方法。

如果它使用了ref參數,那麼你的爲該方法提供輸入。這是行不通的:

int arg; 
if (Int32.TryParse(someString, ref arg)) { // error - variable is not initialsed 

該方法不期待任何輸入的值參數,如果你將不得不提供的輸入值,它並不清楚那會,不然怎麼會被使用。

0

在我的經驗中,無論如何,當你不想打擾初始化的時候,還有更多的時候比想要提供默認值的時候多。解析是爲了這一點而設計的。

這個問題是一個很好的問題,我不認爲使用一種方法或其他方法存在嚴重問題。 .NET團隊選擇了out方法,因爲如果不向int添加單獨的方法,它們不能同時使用這兩個方法,這將是令人厭惡的冗餘。

相關問題