Frage

Für ein wenig Hintergrundinformationen, habe ich eine Anwendung, die in einer Schleife läuft, und über immer kreuzen sie ein Verfahren Tick nennt. Es gibt eine Reihe von Klassen, die eine Basisklasse erweitern und alle haben ihre eigenen tick Methoden, und erhält auf eine Abhängigkeitskette hinzugefügt, so dass sagen, wenn Klasse A aufgerufen wird, und es ist Kette Instanzen von B und C hat Dort wird B.Tick genannt , gefolgt von C.Tick, und dann schließlich A.Tick.

So in Pseudo-Code meiner Klasse Art sieht aus wie folgt:

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 funktioniert gut, und bekommt immer den richtigen Wert. Das Problem ist, ich denke, Sie nicht einen Verweis auf eine andere Variable in einer Klasse speichern, so dass, wenn ich neue C (ref ein); und der contructor für C setzt eine Klassenvariable zu einem später nach einem in A aktualisiert wird, ist es wie C nicht mehr weiß, dass seine noch anzunehmen, zeigt auf einem (die jetzt aktualisiert) und ist nur leer ist (wie es ursprünglich innerhalb des Konstruktors war). Jede Idee, wie man das erreichen, was ich bin auf der Suche zu tun, ohne dass C # Zeiger und unsicheren Code zu benutzen? Danke, hoffentlich macht es Sinn:)

Edit: Offenbar können die Menschen nicht Fragen mit verwirrenden Pseudo-Code beantworten, die völlig unabhängig von der eigentlichen Frage, so verändert sich zu:

Edit 2: C-Klasse

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

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

Lösung

Da one eine Arraylist, können Sie nur übergeben Sie es als Referenz. Sie passieren jetzt offenbar als Referenz-to-a-Referenz an den Konstruktor. Sie können nicht, dass ref benötigen.

Aber bitte zeigen eine vollständigere Vorstellung davon, was Sie versuchen zu erreichen.

Edit:

Ihre C-Klasse Nach der Besichtigung gibt es keine Notwendigkeit für die ref. c wird die Instanz der Arraylist teilen, die A one nennt.

Das scheint das allgemeine Reference / Valuetype Problem in .NET einkochen. Fassen wir zusammen:

  • Instanzen von Objekten nicht über einen Namen und können nicht (physisch) als Parameter überhaupt weitergegeben werden.
  • Zugriff Sie immer eine Instanz über einen Verweis. In Ihrem Code, one (2x), two, local sind alle Verweise Instanzen Arraylist.
  • sich die Referenzen wie valuetypes verhalten, dh Zuordnung bedeutet Kopieren.

Um mehr über referencetypes / valuetypes, Suche nach ‚Auto Semantik‘ und vermeiden Nachrichten zu erfahren, die mit beginnen ‚valuetypes existiert auf dem Stapel‘.

Andere Tipps

Es gibt nichts, Sie zu verhindern, dass dies zu tun. Unabhängig davon, ob es eine gute Idee ist eine andere Frage though. Im Allgemeinen würde ich empfehlen daher, Änderungszustand zu vermeiden, zwischen Methode aufruft, wenn Sie es vermeiden können. Natürlich gibt es den Schlüsselausdruck ist „wenn Sie es vermeiden können“. : -)

  

Sie einen Verweis auf eine andere Variable in einer Klasse nicht speichern kann,

Sie können, machen die Leute es die ganze Zeit. weisen Sie einfach zu einem (privat) Feld.

  

so, wenn ich neue C (ref ein); [Schnipp /] später nach einer in A aktualisiert wird, ist es wie C nicht mehr weiß, dass seine noch zu einem Hinweis werden soll

Eigentlich ist es nicht weiß, dass, aber Sie sollten one ein Mitglied Feld zuweisen. Zuweisen von Objekten ist nichts mehr als eine Referenz auf das Objekt zu setzen. das Objekt ändern, ändert sich überall haben Sie es zugewiesen:

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: da Sie Pseudo-Code wurden Posting, ich hoffe, es Ihnen nichts ausmacht mich nicht es ein wenig vereinfacht. Wenn ich Ihre Frage falsch verstanden, dann bitte ignorieren (und vielleicht klären, wenn möglich).

PPS: Ihr (edited) Code rereading und immer noch versuchen, herauszufinden, was das Problem ist, scheint es nichts zu sein, angefangen von einem Mitglied mit einer Referenz C A und ruft a.Add in Ihrem Code verhindert wird offensichtlich spiegeln die Elementvariablen in c sowie. Tatsächlich nicht nötig ref hier.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top