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 に答える