在.net之前,一個正常的模式是TryXX
方法可以簡單地保持傳引用參數參數不被修改。這是一個非常有用的模式,因爲這意味着代碼要使用默認值可以這樣做:
MyNum = 5;
TryParsing(myString, &myNum);
而代碼,不希望使用默認值,可以使用:
if (TryParsing(myString, &myNum))
{ .. code that uses myNum .. }
else
{ .. code that doesn't use myNum .. }
在前面的用法中,調用代碼必須確保myNum
在調用之前被初始化,但不必擔心TryParsing
的返回值。在後一種用法中,調用代碼將不得不擔心返回值,但不必在調用之前初始化myNum
。 TryParsing
例程本身不必擔心使用的是哪一種。
但是,C#並不能很好地允許這種模式,除非TryParsing
用另一種語言編寫。必須寫入TryParsing
,以便前面的值myNum
將被無條件覆蓋而未經檢查,調用者必須無條件地初始化它,或者必須爲這兩種情況提供不同的方法。如果TryParsing
方法是用其他語言編寫的,它理論上可以像舊式方法一樣工作(在成功時寫入參數,如果不是,則保持原樣),同時仍將其稱爲out
參數。然而,我不會推薦這個,因爲古怪的行爲不會侷限於out
參數。
考慮,例如,該樣式的方法使用fooStruct
類型的參數,並fooStruct
有一個看起來像一個構造函數:
fooStruct(string st)
{
fooStruct.TryParse(st, out this);
}
,編譯器將是這樣的構造非常高興,因爲它「絕對」寫道this
。在另一方面,如果一些其他的代碼呢:
while(someCondition)
{
var s = new fooStruct(someString);
...
}
人們可能會想到的是s
要麼持有的初始化結構(如someString
是有效的),或者是空白的(如果不是)。該代碼沒有任何暗示s
可以在循環的重複之間保持其值。儘管如此,這正是可能發生的情況。
此外,如果你關心的結果足夠,你不想使用默認值,除非這是顯式的值是XYZ(解析等)。),那麼你真的應該檢查方法的返回值。 – 2010-03-15 11:17:18
如果嘗試返回false,沒有考慮消費者有理由使用返回的值。 – 2010-03-15 12:06:10