2011-11-21 140 views
9

其實我做一個列表作爲基準參數如下:最佳做法:ref參數或返回值?

public static List ListMethod(List result) 

我看到有些人這樣做太:

public static void ListMethod(ref List result) 

如果我沒有錯,「我」的方法也將list作爲參考參數,您應該可以像「其他」方法一樣使用它。

但是對於我來說,輸入一個參數似乎更「乾淨」,對它做些什麼並將其返回給方法返回值。

針對一種方法或其他方法的任何好的論點?

+0

這是一個列表?爲什麼要發送它參考你試圖實現什麼? –

+3

作爲ref/out傳出時,內部指向堆副本的引用在堆棧中創建,並傳遞給被調用方法。如果使用ref,則使用與傳遞參數相同的引用。 – Zenwalker

+1

爲什麼你認爲你需要在你的第一個方法中返回一個'List'而不是在第二個方法中返回任何東西? – BoltClock

回答

30

這是可能,你不需要使用ref - 但有的差異。

通常當我看到人們使用ref作爲引用類型參數時,這是因爲他們不明白參數傳遞如何工作。但是,如果你的方法是這樣的:

result = new List(); 
... 

然後在第一種情況下調用者將不會看到的變化,而在第二種情況下,調用者的變量將改爲引用新的對象。

請參閱我的article on parameter passing瞭解更多詳情。

+0

感謝'Jon Skeet' – Dotnet

3

如果你只是返回一個List,你應該總是使用第一個,因爲它顯示了這個意圖。

ref的版本告訴我,我可以從列表開始,並且您的方法將修改我發送的列表,或者甚至用另一個列表更改它。如果這是你的意圖,那麼做。

但是,如果方法allways返回一個新的列表,請使用返回值而不是ref參數。

上側的注意事項:你可以使用out而不是ref顯示您返回一個新的列表的意圖,但是這僅僅是一個很好的做法,如果您使用的是別的東西返回值。

11

不,您的方法不使用ref參數。默認值是pass by value

不同之處在於,您的方法只能修改列表的內容,而不能修改參數result指向的參考。

什麼是最好的方法?這取決於你的方法應該做什麼。

當您的方法修改列表或返回新數據時,您應該使用返回值。 它比使用ref參數更好地理解你的代碼。

返回值的另一個好處是可以使用方法鏈。

你可以這樣使得從一個方法列表參數傳遞給另一個寫代碼:

ListMethod1(list).ListMethod2(list)... 
+3

+1能力做方法鏈接。如果你真的想,你甚至可以做*和*修改一個參數;一個'返回結果;'在LOC,CPU或複雜性方面都不是很昂貴,並且可以使功能消費者的生活更輕鬆。 –

1

唯一特別的在這裏參考的參數是 - 「與裁判傳遞一個變量必須先賦值。 」。所以,如果你想讓調用方法在調用之前賦值,那麼你可以使用ref參數。