0

ちょっとした背景情報として、ループで実行されているアプリケーションがあり、ティックごとにメソッド Tick を呼び出します。基本クラスを拡張し、すべて独自の tick メソッドを持ち、依存関係チェーンに追加されるクラスがたくさんあります。つまり、クラス A が呼び出され、そのチェーンに B と C のインスタンスが含まれている場合、B.Tick が呼び出されます。 、続いて C.Tick、最後に A.Tick です。

したがって、擬似コードでは、私のクラスは次のようになります。

public class A : Super
Super b;
Super c;
ArrayList one;
ArrayList two;

tick(){
    one.Add(b.LastValue);
    two.Add(c.LastValue);
            ... do something with one and two ...
}

A(){
    b = new B(some other array list);
    c = new C(ref one);
}

B は正常に機能しており、常に正しい値を取得します。問題は、クラス内の別の変数への参照を保存できないと思うので、 new C(ref one); を実行するときです。Cのコンストラクターはクラス変数を1に設定しています。後でAで1つが更新された後、Cがまだ1つを指しているはずであること(現在更新されている)をCが認識できなくなり、空になっているだけです(元のように)コンストラクター内にありました)。C# ポインターと安全でないコードを使用せずに、私がやろうとしていることを達成する方法についてのアイデアはありますか? ありがとう、うまくいけばそれは理にかなっています:)

編集:どうやら人々は、実際の質問とはまったく関係のない紛らわしい疑似コードで質問に答えることができないため、変更は次のように拡張されます:

編集2:Cクラス

...
ArrayList local;
...
C(ref ArrayList one){
    local = one;
}

Tick(){
   LastValue = local[0] + 5; //not actual formula, just shows trying to use a referenced variable 
}
4

3 に答える 3

2

oneは ArrayList であるため、参照としてのみ渡すことができます。あなたは明らかにコンストラクタへの参照への参照としてそれを渡しています。あなたはそれを必要としないかもしれませんref

ただし、達成しようとしていることのより完全なアイデアを示してください。

編集:

Cクラスを見た後は、ref. cA が呼び出す ArrayList のインスタンスを共有しますone

これは、.NET の一般的な参照型/値型の問題に要約されるようです。要約する:

  • オブジェクトのインスタンスには名前がなく、(物理的に) パラメータとして渡すことはできません。
  • 常に参照を介してインスタンスにアクセスします。あなたのコードでは、one(2x) 、twolocalはすべて Arraylist インスタンスへの参照です。
  • 参照自体は値型のように振る舞います。つまり、代入はコピーを意味します。

参照型/値型の詳細については、「コピー セマンティクス」を検索し、「スタックに値型が存在する」で始まる投稿を避けてください。

于 2009-10-27T21:36:57.263 に答える
0

これを行うことを妨げるものは何もありません。ただし、それが良いアイデアかどうかは別の問題です。一般に、回避できる場合は、メソッド呼び出し間で状態を変更しないようにすることをお勧めします。もちろん、ここで重要な表現は「回避できれば」です。:-)

于 2009-10-27T21:43:43.757 に答える
0

クラス内の別の変数への参照を格納することはできません

あなたはできます、人々はいつもそれをします。(プライベート)フィールドに割り当てるだけです。

そのため、新しい C(ref one); を実行すると、[中略/] 後で A で 1 つが更新された後、C はまだ 1 つを指していることになっていることを認識していないようです

実際にはそれを認識していますがone、メンバー フィールドに割り当てる必要があります。オブジェクトへの代入は、オブジェクトへの参照の設定に他なりません。オブジェクトを変更すると、割り当てたすべての場所でオブジェクトが変更されます。

class A
{
    public string Hello { get; set; }
}

class C
{
    private A myA;
    public C(A a) { myA = a; }
    public A GetMyA() { return myA; }
}

// somewhere else:
A someA = new A();
someA.Hello = "Hello World";
C someC = new C(someA);
someA.Hello = "Other World";
Console.WriteLine(someC.GetMyA().Hello);

// this will print "Other World" and not "Hello World" as you suggest

PS: 疑似コードを投稿していたので、少し単純化してもかまいません。私があなたの質問を誤解している場合は、無視してください (可能であれば明確にしてください)。

PPS: (編集された) コードを読み直し、問題の原因を突き止めようとしていCますが、コード内で参照を使用してメンバーを保持することを妨げるものは何もないようでA、呼び出しa.Addによってメンバー変数も明らかに反映さcれます。さすがにrefここはいらない。

于 2009-10-27T21:38:00.040 に答える