2011-08-20 31 views
3

我有一個方法需要List<Foobar>Foobar作爲參數。 Foobar是一個具有私有變量,構造函數和操作數據的方法的常規類。爲什麼我有時必須通過參考和其他時間不通過類?

我修改了在方法中傳遞的兩個實例,但由於某種原因,我必須通過Foobar關鍵字ref,否則在方法完成時更改不會粘住。我不必爲清單做這件事。

我在編程中最近幾次注意到了這一點。通常,在將類的實例傳遞給方法時,修改它將更改實例,但有時不會,並且需要使用關鍵字ref來更改爲stick。它在工作時似乎相當隨意。有人知道爲什麼嗎?

+0

Foobar是類還是結構? – cordialgerm

回答

7

如果參數變化的值,這樣的:

parameter = new SomeValue(); 

那麼該變化將僅可以通過使用ref呼叫者看出。

相反,如果你要變更對象調用者傳遞一個參考的內容,那麼可以參考按值傳遞

public void AppendHello(StringBuilder builder) 
{ 
    // This changes the data within the StringBuilder object that the 
    // builder variable refers to. It does *not* change the value of the 
    // builder variable itself. 
    builder.Append("Hello"); 
} 

見我article on parameter passing以獲取更多信息。

請注意,如果參數類型是一個結構而不是類,那麼您不會將引用的副本傳遞給對象 - 您將傳遞實際數據本身。在這種情況下,您還需要使用ref

+0

哦,好的。非常有意義。謝謝=) –

0

你是什麼意思的「修改它」。您可以將對象傳遞給方法並更改其數據,方法是更改​​屬性或將元素添加到通用列表中。但是,您不能更改該變量指向的實際對象。爲了真正改變,Foobar完全可以說,它需要通過ref。