为什么这只在使用ref关键字时有效?

时间:2011-08-31 05:34:57

标签: c# reference 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,除了在后一个示例中,我只是单独传递其成员变量而不是整个容器。

1 个答案:

答案 0 :(得分:2)

当您调用ChangeFruit(myFruit.apple, myFruit.banana);时,您将在Fruit类中传递这些属性的引用副本。只有那些副本在您的函数中被修改。实际上您正在做的是对您的副本添加一个新的引用,这无法修改您的原始对象。

当您使用ref关键字时,您将传递对这些类型的引用,而不是副本

但是当你致电ChangeFruit(myFruit);时。您正在传递容器引用的副本。它指向堆上的同一对象。而你正在修改它的内容。