2011-08-31 71 views
1

我有這個容器類:爲什麼只有在使用ref關鍵字時才能工作?

class Fruit 
{ 
    public Apple apple; 
    public Banana banana; 
} 

而且我有另一個類,看起來像這樣的功能:

public void ChangeFruit(Fruit fruit) 
{ 
    fruit.apple = memberApple; 
    fruit.banana = memberBanana; 
} 

而且工作正常。

不過,我想知道爲什麼這不起作用:

如果我改變ChangeFruit方法來代替取容器,採取實際的果類,如:

public void ChangeFruit(Apple apple, Banana banana) 
{ 
    apple = memberApple; 
    banana = memberBanana; 
} 

然後這不起作用,除非ref關鍵字與每個參數一起傳遞。爲什麼我需要ref關鍵字而不是那裏?

順便提一下,稱後者ChangeFruit的時候,我把它稱爲是這樣的:

ChangeFruit(myFruit.apple, myFruit.banana); 

與之相對ChangeFruit(myFruit);

我只是想知道通過容器類時,我不需要ref關鍵字,但是當我單獨傳遞每個水果時,我都這麼做。無論哪種方式,我通過myFruit,除了在後面的例子中,我只傳遞其成員變量,而不是整個容器。

+2

http://stackoverflow.com/questions/635915/when-to-use-ref-and-when-it-is-not-necessary-in-c/635934#635934 –

回答

2

當你打電話給ChangeFruit(myFruit.apple, myFruit.banana);時,你在Fruit類中傳遞了這些屬性的引用副本。只有這些副本在你的函數中得到修改。實際上你正在做的是給你的副本添加一個新的引用,它不會修改你的原始對象。

當您使用您傳遞的引用到這些類型的一個ref關鍵字,而不是一個拷貝

但當你叫ChangeFruit(myFruit);。您正在傳遞container的引用副本,它指向堆上的同一個對象。你正在修改它的內容。

+0

好的,謝謝,我明白了。但是,如果我不想在通過時修改變量權限,該怎麼辦?我怎麼能得到這樣的工作? http://pastebin.com/8WBHJnj3 –

+0

不知道我是否正確理解你的問題。但在'DoSomethingWithApple()'方法中,你正在爲你的類中的'apple'字段添加一個新的引用,並且會在您對該方法的呼叫。 –

相關問題