18

だからこれはうまくいく..

public MyClass(ref Apple apple)
{
    apple = new Apple("Macintosh"); // Works fine
}

しかし、このようなことをすることは可能ですか?

private Apple myApple;

public MyClass(ref Apple apple)
{
    myApple = apple;
}

public void ModifyApple()
{
    myApple = new Apple("Macintosh"); // does not change the input variable like the first example did
}

ref変数がメンバー変数myAppleにコピーされると、その「ref-ness」が失われているように見え、再割り当てしても入力変数は変更されなくなります。これを回避する方法はありますか?

4

4 に答える 4

9

ref-ness は、関数に渡す関数と引数のパラメーターのプロパティです。一般に、変数 (またはフィールド) のプロパティではありません。

実際、あなたがそこで試みていることは、最初から運命づけられています。

于 2011-08-31T06:35:56.647 に答える
6

そうではありません。コードが次に呼び出されるまでに、メソッドの引数として使用された元の変数は存在しなくなっている可能性があります。

void Foo()
{
    MyClass x = Bar();
    x.ModifyApple();
}

MyClass Bar()
{
    Apple apple = new Apple();
    return new MyClass(ref apple);
}

ここで、appleはスタック フレーム内のローカルModifyApple変数で、 を呼び出すまでにポップされます。

オブジェクト自体を変更するだけでなく、元の呼び出し元の変数を変更する必要がありますか?

これを偽装する 1 つの方法は、ラッパー タイプを使用して開始することです。

public class MutableWrapper<T>
{
    public T Value { get; set; }
}

次に、を渡し、それをMutableWrapper<Apple>クラスに保存します。次に、次のModifyAppleように記述できます。

wrapper.Value = new Apple();

これは呼び出し元のvariableを変更しませんが、次に呼び出し元がValueプロパティを見ると、新しいリンゴが表示されます。

正直なところ、このようなことはコードの保守を難しくする傾向がありref、可読性にも優れていません。達成しようとしていることの全体像を説明できれば、より良い全体的なアプローチを提案できるかもしれません.

于 2011-08-31T06:38:14.457 に答える
3

いいえ、ありません。myAppleへの参照を保持するフィールドAppleです。ただし、パラメータappleは、実際にはAppleへの参照への参照です。に代入appleすると、パラメータの値が逆参照myAppleされます。それを超えて、それらは別々であり、明確です。

いいえ:それは不可能です。

可能なことは、次のようなものです。

public class AppleWrapper {
    public Apple Value {get;set;}
}

今; を保存するAppleWrapperと、任意の数の発信者がアクセスして変更できます.Value

于 2011-08-31T06:38:39.720 に答える
0

ModifyApple変更された Apple インスタンスを返さないのはなぜですか?

public Apple ModifyApple()
{
    myApple = new Apple("Macintosh"); // does not change the input variable like the first example did
    return myApple;
}
于 2011-08-31T06:41:07.420 に答える