2011-08-31 3 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);을 호출 할 때 이러한 속성의 참조 사본을 과일 클래스에 전달합니다. 그 사본 만이 당신의 기능에서 수정되고 있습니다. 사실 당신이하는 일은 귀하의 본래 사본을 수정할 방법이없는 새로운 사본을 귀하의 사본에 넣는 것입니다. 당신이 ChangeFruit(myFruit);를 호출 할 때

당신은 당신이 그 유형에 대한 참조를 전달됩니다 심판 키워드, 복사본이 아닌

를 사용하지만합니다. 컨테이너의 참조 사본을 전달하고 있습니다.이 컨테이너는 힙의 같은 객체를 가리 킵니다. 당신은 그것의 내용을 수정하고 있습니다.

+0

좋습니다, 감사합니다. 그러나 변수가 전달 될 때 바로 수정하지 않으려면 어떻게해야합니까? 어떻게 이런 일을 할 수 있을까요? http://pastebin.com/8WBHJnj3 –

+0

당신의 질문을 정확하게 이해했는지 확신 할 수 없습니다. 그러나'DoSomethingWithApple()'메소드에서 클래스의'apple' 필드에 새로운 참조를 추가하고 있습니다. 그 방법에 대한 당신의 전화. –