C# 为什么这只在使用ref关键字时起作用?

C# 为什么这只在使用ref关键字时起作用?,c#,reference,ref,C#,Reference,Ref,我有这个容器类: class Fruit { public Apple apple; public Banana banana; } 我在另一个类中有一个函数,如下所示: public void ChangeFruit(Fruit fruit) { fruit.apple = memberApple; fruit.banana = memberBanana; } public void ChangeFruit(Apple apple, Banana banan

我有这个容器类:

class Fruit
{
    public Apple apple;
    public Banana banana;
}
我在另一个类中有一个函数,如下所示:

public void ChangeFruit(Fruit fruit)
{
    fruit.apple = memberApple;
    fruit.banana = memberBanana;
}
public void ChangeFruit(Apple apple, Banana banana)
{
    apple = memberApple;
    banana = memberBanana;
}
ChangeFruit(myFruit.apple, myFruit.banana);
这很好

但是,我想知道为什么这不起作用:

如果我将ChangeFruit方法更改为而不是使用容器,则使用实际的水果类,如下所示:

public void ChangeFruit(Fruit fruit)
{
    fruit.apple = memberApple;
    fruit.banana = memberBanana;
}
public void ChangeFruit(Apple apple, Banana banana)
{
    apple = memberApple;
    banana = memberBanana;
}
ChangeFruit(myFruit.apple, myFruit.banana);
那么,除非每个参数都传递ref关键字,否则这是不起作用的。为什么我需要ref关键字在这里而不是那里

顺便说一下,当我称后者为ChangeFruit时,我是这样称呼它的:

public void ChangeFruit(Fruit fruit)
{
    fruit.apple = memberApple;
    fruit.banana = memberBanana;
}
public void ChangeFruit(Apple apple, Banana banana)
{
    apple = memberApple;
    banana = memberBanana;
}
ChangeFruit(myFruit.apple, myFruit.banana);
ChangeFruit(myFruit)相反


我只想知道当传递容器类时,我不需要ref关键字,但是当我单独传递每个水果时,我需要。无论哪种方式,我都在传递myFruit,除了后一个示例,我只是单独传递其成员变量,而不是传递整个容器。

当您调用
changefuit(myFruit.apple,myFruit.banana)时您正在水果类中传递这些属性引用的副本。只有那些副本在你的函数中被修改。事实上,你所做的是给你的副本添加一个新的引用,而这绝不会修改你的原始对象

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


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

好的,谢谢,我理解。但是,如果我不想在传递变量时正确修改它,该怎么办?我怎么能让这样的东西工作呢?不确定我是否正确理解了您的问题。但是在
DoSomethingWithApple()
方法中,您正在向类中的
apple
字段添加一个新引用。这将在调用该方法后得到反映。