1

我有这个容器类:

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

4

1 回答 1

2

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

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

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

于 2011-08-31T05:52:45.187 回答