Почему это работает только при использовании ключевого слова ref? - PullRequest
1 голос
/ 31 августа 2011

У меня есть контейнер этого класса:

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, за исключением последнего примера, я просто передаю переменные-члены индивидуально, а не весь контейнер.

1 Ответ

2 голосов
/ 31 августа 2011

когда вы звоните ChangeFruit(myFruit.apple, myFruit.banana);, вы передаете копии ссылок на эти свойства в классе Fruit.Только те копии модифицируются в вашей функции. Фактически, вы делаете новую ссылку на вашу копию, которая никак не собирается изменять ваш оригинальный объект.ссылка на эти типы, а не копия

Но когда вы звоните ChangeFruit(myFruit);.Вы передаете копию ссылки вашего контейнера. которая указывает на тот же объект в куче.и вы изменяете его содержимое.

...