我有这个容器类:
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,除了在后一个示例中,我只是单独传递其成员变量而不是整个容器。
答案 0 :(得分:2)
当您调用ChangeFruit(myFruit.apple, myFruit.banana);
时,您将在Fruit类中传递这些属性的引用副本。只有那些副本在您的函数中被修改。实际上您正在做的是对您的副本添加一个新的引用,这无法修改您的原始对象。
当您使用ref关键字时,您将传递对这些类型的引用,而不是副本
但是当你致电ChangeFruit(myFruit);
时。您正在传递容器引用的副本。它指向堆上的同一对象。而你正在修改它的内容。